home *** CD-ROM | disk | FTP | other *** search
/ Windows News 2010 Summer - Disc 1 / WN_Ete2010_CD1.iso / Onglet5 / Weezo / Weezo setup.exe / {code_appDir} / www / includes / outputFunctions.php < prev    next >
PHP Script  |  2010-05-19  |  127KB  |  2,685 lines

  1. <?php
  2. /**
  3.  * HTML output functions
  4.  *
  5.  * Misc function formating output HTML
  6.  *
  7. * parameters : POST data1 (file directory),  data2 (file name),  data3 (="view"),  data4 (action (optional)),  data5 (parameters (optional))
  8.  *
  9.  * PHP version 5
  10.  *
  11.  * LICENSE: This source file is subject to version 3.0 of the PHP license
  12.  * that is available through the world-wide-web at the following URI:
  13.  * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
  14.  * the PHP License and are unable to obtain it through the web, please
  15.  * send a note to license@php.net so we can mail you a copy immediately.
  16.  *
  17.  * @category   NA
  18.  * @package    NA
  19.  * @author     Nicolas Bruley / Peer 2 World <contact@weezo.net>
  20.  * @copyright  2005-2009 Nicolas Bruley / Peer 2 World
  21.  * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  22.  * @version    CVS: $Id:$
  23.  * @link       http://www.weezo.net
  24.  * @since      File available since Release 1.0.0
  25.  */
  26.  
  27. // outControl constants
  28. define('dataText',0);
  29. define('dataNumeric',1);
  30. define('dataList',2);
  31. define('dataBoolean',3);
  32. define('dataFolderPath',4);
  33. define('dataFilePath',5);
  34. define('dataPassword',6);
  35. define('dataImage',7);
  36. $a=1;
  37. define('alignLabelControl',0); // states that control is located right of caption/image
  38. define('alignControlLabel',1); // states that control is located left of caption/image
  39.  
  40. /*
  41.  ***************************************************************************************************************************
  42.  * Error page
  43.  ***************************************************************************************************************************
  44.  */
  45.  
  46. /**
  47.  * @return void
  48.  * @param string $errorMessage : utf-8 encoded message to display
  49.  * @param string $errorTitle : utf-8 encoded message to display
  50.  * @param bool $exitAfter : true if script should exist after having displayed error page
  51.  * @desc Display an error page and exit
  52. */
  53. function outDisplayErrorPage($errorMessage, $errorTitle=false, $exitAfter=true, $options=false){
  54.     if(!cfBGetVar('name')) cfSetBrowserCaps();
  55.  
  56.     // Mobiles
  57.     if(cfIsMobile()){
  58.         require_once(INCLUDE_DIR.'mobileFunctions.php');
  59.         mfInsertHead(array('noTopControls'=>1));
  60.     }
  61.     // Regular browsers
  62.     else{
  63.         cfInsertHEAD(false);
  64.         if(cfBGetVar('name')=='iPhone') echo '<meta name="viewport" content="width=device-width, user-scalable=yes,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">';
  65.         echo '</head>';
  66.         echo '<body class="errorPage" style="overflow:hidden;margin:0;padding:0">';
  67.     }
  68.     ?>
  69. <table class="frame1" height="100%" width="100%" border="0" cellspacing=0 cellpadding=0 style="margin:0;padding:0;" id="errTable">
  70. <tr><td class="frame1Header" style="width:100%; vertical-align:middle">
  71.     <?php
  72.     // Icon
  73.     if(is_array($errorTitle) && isset($errorTitle['icon'])) echo outImageIcon($errorTitle['icon']);
  74.     else echo outImage(outIcon('alert'),false,false, "vertical-align:middle;margin-right:1em");
  75.     // Title
  76.     if(is_array($errorTitle) && isset($errorTitle['title'])) echo $errorTitle['title'];
  77.     elseif ($errorTitle) echo $errorTitle;
  78.     else echo cfCaption('genError');
  79.     // Body
  80. ?>
  81. </td></tr><tr><td height="100%" valign="middle" align="center" style="font-weight:bold">
  82. <?php echo $errorMessage;?>
  83. <?php if(@$options['alignBottom']){?>
  84. <script type="text/javascript">alignBottom(dgi('errTable'),winMe,5)</script>
  85. <?php }?>
  86. </td></tr></table>
  87. </body></html>
  88. <?php
  89.     cfLog('Error page displayed : '.$errorMessage,LOG_DBG);
  90.     if($exitAfter) exit();
  91. }
  92.  
  93. /*
  94.  ***************************************************************************************************************************
  95.  * General purpose HTML output scripts
  96.  ***************************************************************************************************************************
  97.  */
  98.  
  99. /**
  100.  * @return HTML code of div frame
  101.  * @param string $class
  102.  * @param string $extraHTML : HTML code to insert in div code
  103.  * @param string $extraStyle : HTML code to insert in style
  104.  * @desc echo frame div declarartion, based on browser type
  105. */
  106. function outDivFrame($class, $extraHTML=false, $extraStyle=false){
  107.     if(cfGetBrowser()=='ie') $output = '<div class="'.$class.'" style="width:100%;'.$extraStyle.'"';
  108.     else {
  109.         $output='<div class="'.$class.'"';
  110.         if($extraStyle) $output.=' style="'.$extraStyle.'"';
  111.     }
  112.     if($extraHTML) $output.=' '.$extraHTML;
  113.     $output.=">";
  114.     return $output;
  115. }
  116.  
  117. /**
  118.  * @return HTML code of div frame table
  119.  * @param string $class
  120.  * @param string $leftHTML : left part HTML code
  121.  * @param string $rightHTML : right part HTML code
  122.  * @param string $extraHTML : HTML code to insert in div code
  123.  * @param string $extraStyle : HTML code to insert in style
  124.  * @desc echo frame div declarartion, based on browser type
  125. */
  126. function outFrameHeaderTable($class, $leftHTML, $rightHTML=false, $extraHTML=false, $extraStyle=false, $centerHTML=false){
  127.     if($rightHTML===false) return '<div class="'.$class.'"'.(($extraHTML)?' '.$extraHTML:'').'>'.$leftHTML."</div>\n";
  128.     $output = '<div class="'.$class.'"'.(($extraHTML)?' '.$extraHTML:'').(($extraStyle)?' style="'.$extraStyle.'"':'').'><table class="'.$class.'" style="width:100%;background:transparent;margin:0px;padding:0px;border:0px;'.(($extraStyle)?$extraStyle:'').'" cellpadding="0" cellspacing="0">';
  129.     if(cfGetBrowser()!='ie' && $centerHTML) $output.='<colgroup><col width="33%"><col width="1%"><col width="33%"></colgroup>';
  130.     $output.='<tr>';
  131.  
  132.     $output.='<td style="display:block;overflow:hidden;white-space:nowrap'.(($centerHTML)?';width:'.((cfGetBrowser()=='ie'||cfGetBrowser()=='webkit')?'33%':'100%'):'').'">'.$leftHTML.'</td>';
  133.     if($centerHTML) $output.='<td style="text-align:center'.(($centerHTML)?';width:1%;white-space:nowrap':'').'">'.$centerHTML.'</td>';
  134.     $output.='<td style="text-align:right;overflow:hidden'.(($centerHTML)?';width:33%;white-space:nowrap':'').'">'.$rightHTML.'</td>';
  135.     $output.='</tr></table></div>';
  136.     return $output;
  137. }
  138.  
  139. /**
  140.  * @return HTML code of div frame
  141.  * @param string $class
  142.  * @param string $extraHTML : HTML code to insert in div code
  143.  * @param string $extraStyle : HTML code to insert in style
  144.  * @desc echo frame div declarartion, based on browser type
  145. */
  146. function outFrameFooterTable($class, $leftHTML, $rightHTML, $extraHTML=false){return outFrameHeaderTable($class, $leftHTML, $rightHTML,$extraHTML);}
  147.  
  148. /**
  149.  * @return HTML code of table tag
  150.  * @param string $class : css class of table
  151.  * @param string $extraHTML : extra HTML code added to table tag
  152.  * @param [extra args] : columns width
  153.  * @desc return declaration of a $class table with no border, margin, padding or background, to be used for elements positionning
  154.  *                 if more than 3 args passed, use extra args as column width
  155. */
  156. function outTableTransparent($class=false, $extraStyle=false, $extraHTML=false){
  157.     $output='<table cellpadding="0" cellspacing="0" style="width:100%;padding:0;margin:0;'.(($extraStyle)?$extraStyle:'').'"'.(($extraHTML)?' '.$extraHTML:'').">";
  158.     if(func_num_args()>3){
  159.         $output.='<colgroup>';
  160.         for($i=3;$i<func_num_args();$i++)    $output.='<col width="'.func_get_arg($i).'">';
  161.         $output.='</colgroup>';
  162.     }
  163.     return $output;
  164. }
  165.  
  166. /**
  167.  * @return string: code
  168.  * @param string $caption : button's caption (utf-8 encoded)
  169.  * @param string $action : optional : action (href)
  170.  * @param string $img : optional : path to button's image
  171.  * @param string $title : optional : button's title
  172.  * @param string $id : optional : button's ID
  173.  * @param string $extraHTML : optional : extra HTML code included in button definition
  174.  * @param boolean $forceFullDisplay: display caption even in compact mode
  175.  * @param boolean $disabled: true to disable button (button can be JS-enable via wl.button.enable function)
  176.  * @desc  Insert HTML code for a button
  177. */
  178. function outButton($caption,$href='#',$img=false,$title=false,$id=false,$extraHTML=false,$forceFullDisplay=false,$disabled=false){
  179.     //Format : <a><i></i><b><img src="icon"/><span>text</span></b><u></u></a>
  180.     //Format : <a><i></i><b><span icon></span><span>text</span></b><u></u></a> (IE with PNG image)/
  181.  
  182.     // Theme specific button
  183.     if(cfTGetVar('buttonFunction') && !isset($_ENV['weezo']['buttonFunction']))
  184.         $_ENV['weezo']['buttonFunction'] = create_function('$caption,$href,$img,$title,$id,$extraHTML,$forceFullDisplay', cfTGetVar('buttonFunction'));
  185.     if(isset($_ENV['weezo']['buttonFunction'])) return $_ENV['weezo']['buttonFunction']($caption,$href,$img,$title,$id,$extraHTML,$forceFullDisplay);
  186.  
  187.     if(cfTGetVar('compactDisplay') && !$forceFullDisplay && $img!==false){
  188.         if(!$title) $title=$caption;
  189.         $caption='';
  190.     }
  191.     // Disabled button, no link
  192.     if($href=='###') $output='<a href="#" class="buttonDisabled"';
  193.     // Disabled button, link or js
  194.     elseif($disabled){
  195.         $output='<a class="buttonDisabled" ';
  196.         // Embed inactive link/js into href
  197.         if(substr($href,0,11)=='javascript:') $output.='href="javascript://'.substr($href,11).'"';
  198.         else $output.='href="javascript://#'.$href.'"';
  199.     }
  200.     // Enabled button
  201.     else $output='<a href="'.$href.'" class="button"';
  202.  
  203.     if($id) $output.=' id="'.$id.'"';
  204.     if($extraHTML) $output.=' '.$extraHTML;
  205.     if($title) $output.=' title="'.$title.'"';
  206.  
  207.     $output.='><i> </i><b>';
  208.     // If IE6 and png, use AlphaImageLoader filter
  209.     if(!cfBGetVar('png') && cfFileExtension($img)=='png') {
  210.         $output.='<span style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.$img.');';
  211.         if(strlen($caption)>0) $output.='margin-right:0.4em;';
  212.         $output.='" class="ieBtPng"></span>';
  213.     }
  214.     else {
  215.         $output.='<img alt="" src="';
  216.         if(strlen($caption)>0) $mr='margin-right:0.4em;'; else $mr='';
  217.         if($img) $output.=$img.'" style="'.$mr.'"'; else $output.='/gfx/v.gif"';
  218.         if($title) $output.=' title="'.$title.'"';
  219.         if($href!='#' && $href!='###') {
  220.             // Disabled button: embed inactive link/js in onclick property
  221.             if($disabled){
  222.                 if(substr($href,0,11)=='javascript:') $output.=' onclick="//'.substr($href,11).';return false;"';
  223.                 else $output.=' onclick="javascript:wl.goURL(\''.$href.'\');"';
  224.             }
  225.             // Enabled button: insert link in onclick property
  226.             else{
  227.                 if(strtolower(substr($href,0,11)!='javascript:')) $output.=' onclick="javascript:W.href=\''.$href.'\';"'; else $output.=' onclick="'.substr($href,11).'; return false;"';
  228.             }
  229.         }
  230.         $output.='><span></span>';
  231.     }
  232.     if(cfIsInApp() && cfGetBrowser()=='ie' && stripos(($_SERVER['HTTP_USER_AGENT']), "msie 7.0")!==false && $caption=='')
  233.         return $output.'<span> </span></b><u> </u></a>';
  234.     return $output.'<span>'.str_replace(' ',' ',$caption).'</span></b><u> </u></a>';
  235. }
  236.  
  237. /**
  238.  * @return string: code
  239.  * @param string $caption : button's caption (utf-8 encoded)
  240.  * @param string $href: button link (false for no)
  241.  * @param string $action : optional : action (href)
  242.  * @param string $img : optional : path to button's image
  243.  * @param string $title : optional : button's title
  244.  * @param string $id : optional : button's ID
  245.  * @param string $extraHTML : optional : extra HTML code included in button definition
  246.  * @param boolean $forceFullDisplay: display caption even in compact mode
  247.  * @desc  Insert HTML code for a disabled button
  248. */
  249. function outButtonDisabled($caption,$href='###',$img=false,$title=false,$id=false,$extraHTML=false,$forceFullDisplay=false){return outButton($caption,((!$href)?'###':$href),$img,$title,$id,$extraHTML,$forceFullDisplay,true);}
  250.  
  251. /**
  252.  * @return void
  253.  * @param string $caption : button's caption (utf-8 encoded)
  254.  * @param string $action : optional : action (href)
  255.  * @param string $img : optional : path to button's image
  256.  * @param string $title : optional : button's title
  257.  * @param string $id : optional : button's ID
  258.  * @param string $extraHTML : optional : extra HTML code included in button definition
  259.  * @desc  Insert HTML code for a "buttonSmall" class button
  260. */
  261. function outButtonSmall($caption,$action='#',$img=false,$title=false,$id=false,$extraHTML=false){
  262.     // Theme specific button
  263.     if(cfTGetVar('buttonSmallFunction') && !isset($_ENV['weezo']['buttonSmallFunction']))
  264.         $_ENV['weezo']['buttonSmallFunction'] = create_function('$caption,$action,$img,$title,$id,$extraHTML', cfTGetVar('buttonSmallFunction'));
  265.     if(isset($_ENV['weezo']['buttonSmallFunction'])) return $_ENV['weezo']['buttonSmallFunction']($caption,$action,$img,$title,$id,$extraHTML);
  266.  
  267.     if(cfGetBrowser()=='gecko'){
  268.         $output='<a href="'.$action.'" class="buttonSmall"';
  269.     }
  270.     else{
  271.         if(substr($action,11)=='javascript:') $action=substr($action,11);
  272.         $output='<a href="javascript:void(0)" class="buttonSmall" '.(($action!='#')?'onmousedown="'.$action.'"':'');
  273.     }
  274.     if($id) $output.=' id="'.$id.'"';
  275.     if($extraHTML) $output.=' '.$extraHTML;
  276.     if($title) $output.=' title="'.$title.'"';
  277.     if(strlen($caption)>0) $mr='margin-right:0.4em;'; else $mr='';
  278.     $output.='>'.outImage((($img)?$img:'/gfx/v.gif'),'',(($title)?' title="'.$title.'"':''),'vertical-align:middle;'.$mr);
  279.     return $output.$caption."</a>";
  280. }
  281.  
  282. /**
  283.  * @return void
  284.  * @param string $caption : button's caption (utf-8 encoded)
  285.  * @param string $img : optional : path to button's image
  286.  * @param string $title : optional : button's title
  287.  * @param string $id : optional : button's ID
  288.  * @param string $extraHTML : optional : extra HTML code included in button definition
  289.  * @desc  Insert HTML code for a "buttonSmall" class button
  290. */
  291. function outButtonSmallDisabled($caption,$img=false,$title=false,$id=false,$extraHTML=false){
  292.     $output='<a href="javascript:void(0)" class="buttonSmallDisabled"';
  293.     if($id) $output.=' id="'.$id.'"';
  294.     if($extraHTML) $output.=' '.$extraHTML;
  295.     if($title) $output.=' title="'.$title.'"><img src="'; else $output.='><img src="';
  296.     if(strlen($caption)>0) $mr='margin-right:0.5em;'; else $mr='';
  297.     if($img) $output.=$img.'" style="vertical-align:middle;'.$mr.'" alt="">'; else $output.='/gfx/v.gif" style="vertical-align:middle;" alt="">';
  298.     return $output.$caption."</a>\n";
  299. }
  300.  
  301. /**
  302.  * @desc Return code for a 80x80 button
  303.  *
  304.  * @param string $content: button HTML content
  305.  * @param string $onclick: onclick action
  306.  * @param string $extraHTML (opt): extra HTML in <>
  307.  * @param string $tooltipText (opt): tootlip text (HTML)
  308.  * @return unknown
  309.  */
  310. function outButton75($content,$onclick,$extraHTML='',$tooltipText=''){
  311.     return '<div class="button75" onclick="'.$onclick.'"  onmousedown="$(this).e.className().remove(\'button75Hover\');$(this).e.className().add(\'button75Active\')" onmouseover="$(this).e.className().add(\'button75Hover\')'.(($tooltipText)?";tooltip(this,'".(addslashes(str_replace('"',"''",$tooltipText)))."')":'').'" onmouseout="$(this).e.className().remove(\'button75Hover\');$(this).e.className().remove(\'button75Active\')"'.$extraHTML.'><table><tr><td>'.$content.'</td></td></table></div>';
  312. }
  313.  
  314.  
  315. /**
  316.  * @desc Return HTML code for a text-copy button
  317.  *
  318.  * @param string $srcId: id of source element
  319.  * @param bool $disabled: true to disable button
  320.  * @return string
  321.  */
  322. function outButtonClipboardCopy($srcId,$disabled=false){
  323.     if(cfGetBrowser()=='ie') return outButton(false,"javascript:wl.clipboardCopy('".$srcId."')",outIcon('paste'),cfCaption('genCopy'),'btID','name="copyButton"',false,$disabled); else return '';
  324. }
  325.  
  326. /**
  327.  * Show a tooltip on mouseover
  328.  * output mouseover and mouseout JS that must be inserted into tag
  329.  *
  330.  * @param string $text (optional) : main tooltip text (utf-8 encoded)
  331.  * @param string $title (optional) : tooltip title (utf-8 encoded)
  332.  * @param string $iconSrc (optional) : tooltip icon src
  333.  */
  334. function outToolTip($text=false, $title=false, $iconSrc=false){
  335.     if($iconSrc) $title='<img src="'.$iconSrc.'" style="vertical-align:middle;margin-right:0.5em">'.$title;
  336.     if($title) $title='\'<b>'.addslashes($title).'</b><br>\''; else $title="''";
  337.     if(!$text) $text='false'; else if(!cfCmpLeft($text,'javascript:')) $text="'".addslashes($text)."'"; else $text=substr($text,11);
  338.     return ' onmouseover="tooltip(this,'.$title.'+'.$text.')" ';
  339. }
  340.  
  341. /**
  342.  * @desc Set document-level keydown handler
  343.  *
  344.  * @param array $keys (keycode=>javascript eval)
  345.  * @return string
  346.  */
  347. function outKeyHandler($jsNode,$keys,$scriptTags=false){
  348.     $out='';
  349.     foreach ($keys as $kc=>$js) $out.=(($out=='')?'':',').'"'.$kc.'":\''.$js.'\'';
  350.     return (($scriptTags)?'<script type="text/javascript">':'').'wl.setKDHandler('.$jsNode.',{'.$out.'})'.(($scriptTags)?'</script>':'');
  351. }
  352.  
  353. /**
  354.  * @return string : path to icon file
  355.  * @param string $iconName : name of icon, with or without file extension
  356.  * @desc return path to icon named $iconName and located in resource's directory or (if not found in resource's directory) in /gfx/.
  357.      Extension (.gif or .png) is determined according to webbrowser's transparency support
  358. */
  359. function outIcon($iconName,$default='/gfx/broken.gif'){
  360.  
  361.     // Search for icon in cache
  362.     if(!isset($_ENV['weezoIcons'])) $_ENV['weezoIcons']=cfMGetVar('weezoIcons');
  363.     if(isset($_ENV['weezoIcons'][cfActualTheme()][$iconName])) return cfCDNPrefix().$_ENV['weezoIcons'][cfActualTheme()][$iconName];
  364.  
  365.     // Look for icon in theme directory
  366.     $iconDir=cfAppThemeDir().'/';
  367.     $themeDir=cfAppThemeDir(true).'/';
  368.     if(cfFileExtension($iconName) && file_exists($iconDir.$iconName)) return cfCDNPrefix().$themeDir.$iconName;
  369.     $iconNameNE=cfFileWithoutExtension($iconName);
  370.     if(file_exists($iconDir.$iconNameNE.'.png')) return  cfCDNPrefix().$themeDir.$iconNameNE.'.png';
  371.     if(file_exists($iconDir.$iconNameNE.'.gif')) return  cfCDNPrefix().$themeDir.$iconNameNE.'.gif';
  372.  
  373.     // resources called in application environnement
  374.     if(isset($_SERVER['APPLICATION_PHP_SELF'])){
  375.         $iconDir=cfAppDocRoot().dirname($_SERVER['APPLICATION_PHP_SELF']).'/';
  376.         if(cfFileExtension($iconName) && file_exists($iconDir.$iconName)) return dirname($_SERVER['APPLICATION_PHP_SELF']).'/'.$iconName;
  377.         $iconName=cfFileWithoutExtension($iconName);
  378.         if(file_exists($iconDir.$iconName.'.png')) return dirname($_SERVER['APPLICATION_PHP_SELF']).'/'.$iconName.'.png';
  379.         if(file_exists($iconDir.$iconName.'.gif')) return dirname($_SERVER['APPLICATION_PHP_SELF']).'/'.$iconName.'.gif';
  380.     }
  381.     // Look for icon in resource directory
  382.     if(isset($_SERVER['PHP_SELF'])) {
  383.         $iconDir=cfAppDocRoot().dirname($_SERVER['PHP_SELF']).'/';
  384.         if(cfFileExtension($iconName) && file_exists($iconDir.$iconName)) return $iconName;
  385.         $iconName=cfFileWithoutExtension($iconName);
  386.         if(file_exists($iconDir.$iconName.'.png')) return  dirname($_SERVER['PHP_SELF']).'/'.$iconName.'.png';
  387.         if(file_exists($iconDir.$iconName.'.gif')) return  dirname($_SERVER['PHP_SELF']).'/'.$iconName.'.gif';
  388.     }
  389.     // If not found, look in /gfx directory
  390.     $iconDir=cfAppDocRoot().'/gfx/';
  391.     if(cfFileExtension($iconName) && file_exists($iconDir.$iconName)) return cfCDNPrefix().'/gfx/'.$iconName;
  392.     $iconName=cfFileWithoutExtension($iconName);
  393.     if(file_exists($iconDir.$iconName.'.png')) return  cfCDNPrefix().'/gfx/'.$iconName.'.png';
  394.     if(file_exists($iconDir.$iconName.'.gif')) return  cfCDNPrefix().'/gfx/'.$iconName.'.gif';
  395.  
  396.     return $default;
  397. }
  398.  
  399. /**
  400.  * @desc Return GIF version of icon if browser doesn't support PNG
  401.  *
  402.  * @param string $iconName
  403.  * @return string
  404.  */
  405. function outIconNPNG($iconName,$default='/gfx/broken.gif'){
  406.     $ico=outIcon($iconName,$default);
  407.     if(!cfBGetVar('png') && cfFileExtension($ico)=='png' && file_exists(cfAppDocRoot().cfFileWithoutExtension($ico).'.gif')) return cfFileWithoutExtension($ico).'.gif';
  408.     return $ico;
  409. }
  410.  
  411. /**
  412.  * @return string path from document root
  413.  * @param string $type : type of resource
  414.  * @param string $subType : sub type of resource
  415.  * @desc return path (from document root) to resource's icon
  416. */
  417. function outResourceIcon($type, $subType){
  418.     // Check if describer file exists and defines an icon
  419.     if(file_exists(cfAppDocRoot().'/res/'.$type.'/'.$subType.'/describer.ini')){
  420.         $describer=cfParse_ini_file(cfAppDocRoot().'/res/'.$type.'/'.$subType.'/describer.ini');
  421.         if(isset($describer['iconFile']) && file_exists( cfAppDocRoot().'/res/'.$type.'/'.$subType.'/'.$describer['iconFile']))
  422.             return '/res/'.$type.'/'.$subType.'/'.$describer['iconFile'];
  423.     }
  424.     // Else check for resourceIcon.gif/.jpg in resource directory
  425.     if(file_exists(cfAppDocRoot().'/res/'.$type.'/'.$subType.'/resourceIcon.gif')) return '/res/'.$type.'/'.$subType.'/resourceIcon.gif';
  426.     elseif(file_exists(cfAppDocRoot().'/res/'.$type.'/'.$subType.'/resourceIcon.jpg')) return '/res/'.$type.'/'.$subType.'/resourceIcon.jpg';
  427.     // Else check for resourceIcon.gif/.jpg in resource upper directory
  428.     elseif(file_exists(cfAppDocRoot().'/res/'.$type.'/resourceIcon.jpg')) return '/res/'.$type.'/resourceIcon.jpg';
  429.     elseif(file_exists(cfAppDocRoot().'/res/'.$type.'/resourceIcon.gif')) return '/res/'.$type.'/resourceIcon.gif';
  430.     // Else return default icon
  431.     elseif(file_exists(cfAppDocRoot().'/res/resourceIcon.gif')) return '/res/resourceIcon.gif';
  432.     else return '';
  433. }
  434.  
  435. /**
  436.  * @desc return HTML code for image, with specified height & width (based on actual image size) and optional link
  437.  *         if img is png and browser IE, return span/DXImageTransform
  438.  * @param string $imagePath: either path & name of image or relative path & name of image
  439.  * @param string href: link
  440.  * @param string $extraHTML: extra HTML code inserted into <img> tag
  441.  * @param string $extraHTML: extra CSS style code inserted into <img> tag
  442.  * @param number $imageSizeRatio: enlarge/shrink image ratio. Set to 1 for real-size
  443.  * @param boolean $setSize: force image size by setting width and height attributes
  444.  * @param boolean $fadeInOnLoad: set visibility=hidden and onload=fade in
  445.  * @return string: HTLM code
  446. */
  447. function outImage($imagePath, $href=false, $extraHTML=false, $extraStyle=false, $imageSizeRatio=1, $setSize=true, $fadeInOnLoad=false){
  448.     if ($href=='#') $href=false;
  449.     // if href, put the <a> tag
  450.     if($href) $output='<a href="'.$href.'"'.(($extraStyle)?' style="'.$extraStyle.'"':'').(($extraHTML)?' '.$extraHTML:'').'>'; else $output='';
  451.  
  452.     // Get image relative and absolute paths
  453.     if(substr($imagePath,1,1)==':') {
  454.         $src=cfExtImage($imagePath);
  455.         $completeFileName=$imagePath;
  456.     }
  457.     else{
  458.         $src=$imagePath;
  459.         if(substr($imagePath,0,1)=='/') $completeFileName=cfAppDocRoot().$imagePath; else $completeFileName=substr($_SERVER['SCRIPT_FILENAME'],0,strrpos($_SERVER['SCRIPT_FILENAME'],'/')).'/'.$imagePath;
  460.     }
  461.     // If browser doesn't support PNG
  462.     if(!cfBGetVar('png') && cfFileExtension($src)=='png') {
  463.         // Get image size
  464.         list($width, $height, $type, $attr) = @getimagesize($completeFileName); $width*=$imageSizeRatio; $height*=$imageSizeRatio;
  465.  
  466.         // if a width or height is passed in extra style, stretch image, else display full-size
  467.         if(strpos($extraStyle,'height') || strpos($extraStyle,'width')) $sizingMethod='scale'; else  $sizingMethod='image';
  468.         $output.='<span style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.$src.', sizingMethod='.$sizingMethod.');';
  469.         $output.='width:'.$width.'px; height:'.$height.'px;';
  470.         $output.=(($href)?' cursor:pointer;':'');
  471.         if(!$href) $output.=(($extraStyle)?' '.$extraStyle:'');
  472.         $output.='"';
  473.         if(!$href) $output.=(($extraHTML)?' '.$extraHTML:'');
  474.         $output.="></span>";
  475.     }
  476.     // Browser supports PNG
  477.     else {
  478.         // No png fade-in in IE
  479.         if(cfGetBrowser()=='ie') $fadeInOnLoad=0;
  480.         $output.='<img src="'.$src.'" alt=""';
  481.         // Force image size
  482.         if($setSize){
  483.             list($width, $height, $type, $attr) = @getimagesize($completeFileName); $width*=$imageSizeRatio; $height*=$imageSizeRatio;
  484.             $output.=' width="'.$width.'" height="'.$height.'"';
  485.         }
  486.         // Fade-in and style
  487.         if($fadeInOnLoad) $output.=' onload="fade(this)"';
  488.         if($extraStyle && !$href) $output.=' style="'.$extraStyle.(($fadeInOnLoad)?';visibility:hidden':'').'"';
  489.         elseif ($fadeInOnLoad) $output.=' style="visibility:hidden"';
  490.         // extraHTML
  491.         if(!$href && $extraHTML) $output.=' '.$extraHTML.'>'; else $output.='>';
  492.     }
  493.     if($href) $output.='</a>';
  494.     return $output;
  495. }
  496.  
  497. /**
  498.  * @desc return outImage, with theme-defined size (use theme var "themeImageWidth")
  499.  *
  500.  * @param string $imagePath : either path & name of image or relative path & name of image
  501.  * @param string href : link
  502.  * @param string $extraHTML : extra HTML code inserted into <img> tag
  503.  * @param string $extraHTML : extra CSS style code inserted into <img> tag
  504.  */
  505. function outThemeImage($imagePath,$href=false,$extraHTML=false, $extraStyle=false){
  506.     return outImage($imagePath, $href, $extraHTML, $extraStyle, ((cfTGetVar('iconRatio'))?cfTGetVar('iconRatio'):1),true);
  507. }
  508.  
  509. /**
  510.  * @desc Return code for a simple left-side icon
  511.  *
  512.  * @param string $icoName: ico filename without ext, from /gfx path
  513.  * @param string $extraHTML
  514.  * @param string $extraStyle
  515.  * @return string
  516.  */
  517. function outImageIcon($icoName,$extraHTML='',$extraStyle=''){
  518.     return '<img src="'.outIcon($icoName).'" alt="" style="vertical-align:middle;margin-right:0.5em'.$extraStyle.'" '.$extraHTML.'>';
  519. }
  520.  
  521. /**
  522.  * @return void
  523.  * @desc draw a drop shadow around an HTML object, including it into a table containing parts of shadow.
  524.  *       this function must be called after object has been sent to output.
  525.  * @param int $width   HTML width of table (optional)
  526. */
  527. function outShadowBefore($width=false){
  528.     static $b;    if(!$b) $b=cfGetBrowser();
  529.  
  530.     if(cfTGetVar('noShadow')) return;
  531.     echo '<table cellpadding=0 cellspacing=0 ';
  532.     if($width) echo 'width="'.$width.'"'; else echo 'width="1px"';
  533.     if($b=='opera') echo '><tr><td colspan="2" rowspan="2">';// Opera
  534.     elseif($b=='gecko'||$b=='webkit')  echo '><tr><td colspan="2">';// Firefox/Netscape
  535.     else echo '><tr><td>';// IE
  536. }
  537.  
  538. /**
  539.  * @return void
  540.  * @desc draw a drop shadow around an HTML object, including it into a table containing parts of shadow. (mainly used to draw shadow around photo frames)
  541.  *       this function must be called after object has been sent to output.
  542. */
  543. function outShadowAfter(){
  544.     static $b;    if(!$b) $b=cfGetBrowser();
  545.  
  546.     if(cfTGetVar('noShadow')) return;
  547.  
  548.     if($b=='opera'){ // Opera
  549. ?></td><td class="sOrt"><img src="/gfx/s/rt.png" alt=""></td></tr><tr><td class="sOr"><img src="/gfx/s/_h.png" alt=""></td></tr><tr class="sOtrb"><td><img src="/gfx/s/lb.png" alt=""></td><td class="sOb"><img src="/gfx/s/_v.png" alt=""></td><td><img src="/gfx/s/rb.png" alt=""></td></tr></table><?php } // Firefox / Netscape
  550.     else if (cfGetBrowser()=='gecko'||$b=='webkit') {?></td><td class="sGr"></td></tr><tr class="sGtrb"><td width="10"><img src="/gfx/s/lb.png" alt=""></td><td class="sGb"><img src="/gfx/s/_h.png" alt=""></td><td><img src="/gfx/s/rb.png" alt=""></td></tr></table><?php }
  551.     else{//IE and others...
  552.         ?></td><td class="sIEr"> </td></tr><tr class="sIEtrb"><td class="sIEb"></td><td class="sIErb"></td></tr></table><?php }
  553. }
  554.  
  555. /**
  556.  * @return void
  557.  * @desc draw a drop shadow around an HTML object, including it into a table containing parts of shadow. Used to draw shadow around frame1/2/3
  558.  *       this function must be called after object has been sent to output.
  559. */
  560. function outFrameShadowAfter(){
  561.     static $b;    if(!$b) $b=cfGetBrowser();
  562.  
  563.     if(cfTGetVar('noShadow')) return;
  564.  
  565.     if($b=='opera'){ // Opera
  566.         ?></td>
  567. <td class="fsOrt"><img src="/gfx/s/rt.png" alt=""></td></tr><tr>
  568. <td class="fsOr"><img src="/gfx/s/_h.png" alt=""></td></tr><tr class="fsOtrb">
  569. <td><img src="/gfx/s/lb.png" alt=""></td>
  570. <td class="fsOb"><img src="/gfx/s/_v.png" alt=""></td>
  571. <td><img src="/gfx/s/rb.png" alt=""></td>
  572. </tr></table>
  573.     <?php } // Firefox / Netscape
  574.     else if ($b=='gecko'||$b=='webkit') {?></td>
  575. <td class="fsGr"></td>
  576. </tr><tr class="fsGtrb"><td width="10"><img src="/gfx/s/lb.png" alt=""></td>
  577. <td class="fsGb"><img src="/gfx/s/_h.png" alt=""></td>
  578. <td><img src="/gfx/s/rb.png" alt=""></td></tr></table>
  579.     <?php }
  580.     else{//IE and others...
  581.         ?>
  582. </td><td class="fsIEr"> </td></tr><tr class="fsIEtrb">
  583. <td class="fsIEb"></td>
  584. <td class="fsIErb"></td></tr></table>
  585.     <?php }
  586. }
  587.  
  588. /**
  589.  * @return void
  590.  * @param string $URL : destination URL of POST method
  591.  * @param string $value1 : default value of field 1 (usually current directory)
  592.  * @param string $value2 : default value of field 2 (usually selected file, filled by javascript)
  593.  * @param string $value3 : default value of field 3 (usually required action, filled by javascript)
  594.  * @param string $value4 : default value of field 4 (usually empty, extra passed data, filled by javascript)
  595.  * @param string $value5 : default value of field 5 (usually empty, extra passed data, filled by javascript)
  596.  * @param boolean $forceAsyncSubmit : true if form must be submited using HTTPXmlRequest
  597.  * @param boolean $noSt : true if noSt input must be added in order to disable request log into DB
  598.  * @desc Insert hidden form used by most "explorer" resources for communicating users actions to scripts
  599. */
  600. function outInsertStandardComForm($URL, $value1=false, $value2=false, $value3=false, $value4=false, $value5=false, $forceAsyncSubmit=false, $noSt=false){
  601.     $dbg=cfMGetVar('comFormDebug');
  602. ?>
  603. <script language="javascript" type="text/javascript">
  604. function fillAndSubmit(d2,d3,d4,d5,forceAsync){
  605. var cF=D.comForm; for(var i=2;i<6;i++) eval('if(d'+i+'!==undefined && d'+i+'!==false) cF.data'+i+'.value=d'+i)
  606. <?php
  607.     // Fix for non-resource scripts
  608.     if(!isset($_SESSION['activeResourceId'])) $_SESSION['activeResourceId']='';
  609.     // If resource uses Async submit, form should be asyns submited if no target is specified for form
  610.     if($forceAsyncSubmit || cfRGetVar('useHTTPXmlRequest')) {
  611. ?>
  612. if((cF.target=="" || cF.target=="_self" || forceAsync) && forceAsync!="sync") return asyncSubmit(true);    else cF.submit();
  613. <?php
  614.     } else{
  615. ?>
  616. if(forceAsync && forceAsync!='sync') return asyncSubmit(true);
  617. else {if(W.winUseWindows && (cF.target=="" || cF.target=="_self")) winMe.setReloading();cF.submit();}
  618. <?php
  619.     }
  620. ?>
  621. return true;
  622. }
  623. </script>
  624. <form id="comForm" name="comForm" action="<?php echo $URL;?>" method="POST" enctype="multipart/form-data" style="display:none<?php if($dbg) echo 'e';?>" target="_self">
  625. <input name="data1"<?php if($value1) echo ' value="'.$value1.'"';?>>
  626. <input name="data2"<?php if($value2) echo ' value="'.$value2.'"';?>>
  627. <input name="data3"<?php if($value3) echo ' value="'.$value3.'"';?>>
  628. <input name="data4"<?php if($value4) echo ' value="'.$value4.'"';?>>
  629. <input name="data5"<?php if($value5) echo ' value="'.$value5.'"';?>>
  630. <input name="resId" value="<?php echo $_SESSION['activeResourceId'];?>">
  631. <?php if($noSt) echo '<input name="noSt" value="true">';
  632.     if($dbg) {
  633. ?>
  634. <input type="button" value="Sync" onclick="fillAndSubmit(undefined,undefined,undefined,undefined,'sync')">
  635. <input type="button" value="Async" onclick="fillAndSubmit(undefined,undefined,undefined,undefined,true)">
  636. <?php
  637.     }
  638.     echo "</form>";
  639. }
  640. /**
  641.  * @desc Toggle collapse button
  642.  *        When clicked on, this button collapse/uncollapse the element identified by $collapsedId id.
  643.  *          This button must be used along with wl.nodeCollapseToggle JS function (PHP function : w)
  644.  *
  645.  * @param string $collapsedId : id of element to collapse
  646.  * @param string $phpLinkedVarName (optional): name of php boolean resource variable indicating wether element should be shown (true) or collapsed (false)
  647.  *             if present, resource variable named $phpLinkedVarName will be dynamically updated through async request
  648.  * @param string $defaultShow (optional): true if default visibility is shown (unused if $phpLinkedVarName)
  649.  * @param string $jsCallbackFunction (optional): javascript function called back on fold/unfold steps
  650.  *
  651.  *
  652.   * @return string : HTML codexxxxx
  653.  */
  654. function outButtonToggleCollapse($collapsedId, $phpLinkedVarName=false, $defaultShow=true, $jsCallbackFunction='false'){
  655.     //if($jsCallbackFunction!='false') $jsCallbackFunction="'".$jsCallbackFunction."'";
  656.     if(!$phpLinkedVarName) $show=$defaultShow; else $show=cfRGetVar($phpLinkedVarName);
  657.     $output=outButtonSmall(false,'javascript:wl.nodeCollapseToggle(\''.$collapsedId.'\','.(($phpLinkedVarName)?'\''.$phpLinkedVarName.'\'':'false').', '.$jsCallbackFunction.')',outIcon('minus'),cfCaption('genHide'),$collapsedId.'BtMinus','style="display:'.(($show)?'inline':'none').'"');
  658.     return $output.outButtonSmall(false,'javascript:wl.nodeCollapseToggle(\''.$collapsedId.'\','.(($phpLinkedVarName)?'\''.$phpLinkedVarName.'\'':'false').', '.$jsCallbackFunction.')',outIcon('plus'),cfCaption('genShow'),$collapsedId.'BtPlus','style="display:'.((!$show)?'inline':'none').'"');
  659. }
  660.  
  661. /**
  662.  * @desc : insert div tag for a collapsable frame
  663.  *
  664.  * @param string $collapsedId : id of frame
  665.  * @param string $phpLinkedVarName (optional) : linked php var. If not set, always display frame at page load
  666.  * @param string $extraHTML (optional) : extra HTML
  667.  * @param string $isCollapsed (optional, forbidden if $phpLinkedVarName is provided) : initial state
  668.  */
  669. function outCollapsableFrame($collapsedId, $phpLinkedVarName=false,$extraHTML=false, $isCollapsed=true){
  670.     return '<div id="'.$collapsedId.'"'.((($phpLinkedVarName && cfRGetVar($phpLinkedVarName)) || !$isCollapsed)?'':' style="position:relative;height:1px;overflow:hidden;margin:0;padding:0"').' '.(($extraHTML)?$extraHTML:'').'>';
  671. }
  672.  
  673. /**
  674.  * @desc HTML code for a vertical td for folding / unfolding another TD
  675.  *
  676.  * @param string $tdId: id of td to collapse/unfold, name of PHP linked var
  677.  * @param string $pos: 'right' (if collapsable td is in the right-part of screen) or 'left' else
  678.  * @param array $options (innerHTML, extraHTML, postToggleJS, class)
  679.  * @return string
  680.  */
  681. function outCollapsableTD($tdId,$pos='right',$options=array()){
  682.     $preToggleJS=isset($options['preToggleJS'])?$options['preToggleJS']:'';
  683.     $postToggleJS=isset($options['postToggleJS'])?$options['postToggleJS']:'';
  684.     $extraHTML=isset($options['extraHTML'])?$options['extraHTML']:'';
  685.     
  686.     // Handle
  687.     $out='<td class="colTD colTD'.ucfirst($pos).'" onclick="'.$preToggleJS.';toggleTD(\''.$tdId.'\');'.$postToggleJS.'" id="'.$tdId.'_colTD" '.$extraHTML.' title="'.((cfRGetVar($tdId))?cfCaption('genHide'):cfCaption('genShow')).'">';
  688.     if(isset($options['innerHTML'])) $out.=$options['innerHTML'].'<br>';
  689.     $out.='<script type="text/javascript">var hideCaption="'.cfCaption('genHide').'", showCaption="'.cfCaption('genShow').'"</script>';
  690.     $out.='<div class="'.((!cfRIssetVar($tdId) || cfRGetVar($tdId))?'colTDUF':'colTDF').'"></div>';
  691.  
  692.     cfDragAddItem($tdId.'_colTD','+RECEIVER_ONLY+HIGHLIGHT_FUNCtoggleTDHL');
  693.     return $out.'</td>';
  694. }
  695.  
  696. /**
  697.  * @desc : insert help button : async call /help.php script for on-screen help display
  698.  *
  699.  * @param string $helpCaption : caption reference
  700.  */
  701. function outHelpButton($helpCaption){
  702.     return outButtonSmall(false, 'javascript:wl.showHelp(\''.addslashes($helpCaption).'\')',outIcon('help'),cfCaption('genHelp'),false,'style="vertical-align:middle"');
  703. }
  704.  
  705. /**
  706.  * @desc return string truncated to $maxlength chars, and finished with "..."
  707.  *
  708.  * @param string $caption
  709.  * @param integer $maxlength
  710.  * @return string
  711.  */
  712. function outCaptionTruncated($caption, $maxlength){
  713.     if(strlen($caption)>$maxlength) return substr($caption,0,$maxlength-3).'...'; else return $caption;
  714. }
  715.  
  716. /**
  717.  * @desc Return tags needed to transform a node's children nodes with eH attribute into eHover-able items
  718.  *
  719.  * @return string attributes
  720.  */
  721. function outEHoverFrameAttr($extramousemove='',$extramouseout=''){return ' onmousemove="eHover(event);'.$extramousemove.'" onmouseout="eHover();'.$extramouseout.'"';}
  722.  
  723. /**
  724.  * @desc Return flash player code
  725.  *
  726.  * @param string $src: swf source
  727.  * @param string $id: id
  728.  * @param integer $width
  729.  * @param integer $height
  730.  * @param array $options: array of player options (param & embed properties)
  731.  * @param array $srcGET: get options for swf source
  732.  * @param string $extraHTML: extra HTML code included to object and embed tags
  733.  * @return string: HTML code
  734.  */
  735. function outFlashPlayer($src,$id,$width=100,$height=100,$options=array(),$srcGET=array(),$extraHTML=''){
  736.     // SWF source GET parameters
  737.     if(!strpos($src,'?')) $src.='?'; else $src.='&';
  738.     $src.='v='.cfGGetVar('appVersion');
  739.     if(is_array($srcGET) && count($srcGET)){
  740.         foreach ($srcGET as $key=>$value) $src.='&'.$key.'='.$value;
  741.     }
  742.     //$src=cfHostName().$src;
  743.  
  744.     // Player default options
  745.     if(!is_array($options)) $options=array();
  746.     $options+=array(
  747.     'movie'=>$src,
  748.     'allowScriptAccess'=>'sameDomain',
  749.     'allowFullScreen'=>'true',
  750.     'fullScreenRect'=>'true',
  751.     'quality'=>'high',
  752.     'bgcolor'=>'#000',
  753.     'wmode'=>'transparent',
  754.     'swLiveConnect'=>'true'
  755.     );
  756.  
  757.     $output='<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"'."\n".'    id="'.$id.'"'."\n".'    codebase="http'.((isset($_SERVER['HTTPS']))?'s':'').'://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0"'."\n".'    width="'.$width.'"'."\n".'    height="'.$height.'"'."\n".'    align="middle" '.$extraHTML.'>'."\n";
  758.  
  759.     // IE Settings
  760.     foreach ($options as $key=>$value) {
  761.         if($value===true) $value='true';
  762.         elseif($value===false) $value='false';
  763.         $output.='    <param name="'.$key.'" value="'.$value.'" />'."\n";
  764.     }
  765.  
  766.     // Firefox / Opera
  767.     $options+=array(
  768.     'width'=>$width,
  769.     'height'=>$height,
  770.     'type'=>'application/x-shockwave-flash',
  771.     'quality'=>'high',
  772.     'pluginspage'=>'http'.((isset($_SERVER['HTTPS']))?'s':'').'://www.macromedia.com/go/getflashplayer'
  773.     );
  774.     unset($options['movie']);
  775.     unset($options['swLiveConnect']);
  776.     $output.='    <embed name="'.$id.'" id="'.$id.'Embed" src="'.$src.'" '.$extraHTML."\n";
  777.     foreach ($options as $key=>$value) {
  778.         if($value===true) $value='true';
  779.         elseif($value===false) $value='false';
  780.         $output.='        '.$key.'="'.$value."\" \n";
  781.     }
  782.     return $output."    />\n</object>\n";
  783. }
  784.  
  785. /*
  786.  ***************************************************************************************************************************
  787.  * Explorer specific HTML controls output scripts
  788.  ***************************************************************************************************************************
  789.  */
  790.  
  791. /**
  792.  * @desc Send files button. Button is not present if file send not allowed
  793.  *
  794.   * @return string : HTML code
  795.  */
  796. function outExplorerButtonSend(){
  797.     if(cfRGetVar('sendAllowed')) return outButton(cfCaption('genSend'),'javascript:send(\'displayForm\')',outIcon('send'));
  798. }
  799.  
  800. /**
  801.  * @desc Download file button. Button is not present if file download not allowed
  802.  *
  803.   * @param integer $fileIndex : index of file to download
  804.   * @param string $title (optional) : title of button
  805.   * @return string : HTML code
  806.  */
  807. function outExplorerButtonDownload($fileIndex, $title=false){
  808.     if(cfRGetVar('downloadShortcut')) return outButton(false,'javascript:dl(\''.$fileIndex.'\')',outIcon('dl'),($title)?$title:cfCaption('genDownload'));
  809. }
  810.  
  811. /**
  812.  * @desc Display a path where sub-paths are hyperlink to sub-paths
  813.  *
  814.  * @param string $path : path to display
  815.  * @param boolean $includeJS : include or not neededJS
  816.  * @return string : HTML code
  817.  */
  818. function outClickablePath($path, $includeJS=true){
  819.     global $clickablePathIndex;
  820.  
  821.     $output='';
  822.     // Include javascript
  823.     if(!isset($clickablePathIndex)) {
  824.         $clickablePathIndex=1;
  825.         if($includeJS){
  826.             $output.= '<script language="javascript" type="text/javascript">'."\n";
  827.             $output.="function cPath(index,lvl,fbp){\n";
  828.             if(cfRGetVar('path')=='computerRoot') $output.='if(index=="computerRoot") {document.comForm.data1.value="*resourceBasePath*"; path=".";} else {';
  829.             $output.='if(fbp) {var path="*resourceBasePath*/"; var i=1;} else {var path="";var i=0;}';
  830.             $output.='for(;i<lvl+1;i++){path+=dgi(\'cp\'+index+\'_\'+i).innerHTML+\'/\';}'."\n";
  831.             if(cfRGetVar('path')=='computerRoot') $output.="}\n";
  832.             $output.="maskShow(1);\n";
  833.             $output.='fillAndSubmit(path,"goDirect","","");}</script>'."\n";
  834.         }
  835.     }
  836.  
  837.     if(!cfRGetVar('subFoldersIncluded')) return false;
  838.      if(cfRGetVar('efCurrentDirectory')=='computerRoot') {return $output.'<a href="javascript:cPath(\'computerRoot\')">'.outImage(outIcon('computerRoot'),false,'title="'.cfCaption('explorerComputerRoot').'"','vertical-align:middle').'</a>';}
  839.     $fromResourceBasePath=false;
  840.  
  841.     if(cfSharedMode()=='list'){
  842.         $path=str_replace('*resourceBasePath*','.',$path);
  843.         $fromResourceBasePath=true;
  844.     }
  845.  
  846.     // Internal counter, incremented on each outClickablePath function call, used to have multiple clickable paths in a page
  847.     elseif(cfCmpLeft($path,'*resourceBasePath*')){
  848.         //echo substr(strrchr('/'.cfRGetVar('path'),'/'),1);
  849.         $path=str_replace('*resourceBasePath*',substr(strrchr('/'.cfRGetVar('path'),'/'),1),$path);
  850.         $fromResourceBasePath=true;
  851.     }
  852.     $path=explode('/',$path);
  853.     if(count($path)==0 || (!$fromResourceBasePath && (strlen($path[0])!=2 || substr($path[0],1,1)!=':'))) return false;
  854.     // Computer root label
  855.     if(cfRGetVar('path')=='computerRoot') $output.='<a href="javascript:cPath(\'computerRoot\')" class="link">'.outImage(outIcon('computerRoot'),false,'title="'.cfCaption('explorerComputerRoot').'"','vertical-align:middle').'</a> /';
  856.     foreach ($path as $key=>$value)
  857.         $output.='<a href="javascript:cPath('.$clickablePathIndex.','.$key.','.(($fromResourceBasePath)?'true':'false').')" id="cp'.$clickablePathIndex.'_'.$key.'" class="link">'.(($value=='.')?outImage(outIcon('home'),false,false,'vertical-align:middle'):cfUTF8Encode($value)).'</a>/';
  858.     return $output;
  859. }
  860.  
  861. /**
  862.  * @desc Insert form (file input + upload button) and script for file upload
  863.  *
  864.  * @param integer $inputWidth : optional : width of file input
  865.  * @param string $ackJSFunction : optional : name of javascript function, located in parent window, called when upload is completed
  866.  * @param bool $submitButton : optional : submit button state : 'enabled', 'disabled', 'none'
  867.  * @param bool singleUpload : optional : set to true if as single upload window may be opened,
  868.  *                                          set to false if multiple simultaneous downloads are allowed
  869.  * @param string $extraInnerHTML : extra HTML code to be embeded in form
  870.  */
  871. function outUploadForm($inputWidth=20,$ackJSFunction=false,$submitButton='enabled', $singleUpload=false, $extraInnerHTML=false){
  872.     // Pre-upload form
  873.     ?>
  874. <div id="htmlUploadStuff">
  875.     <form name="preUploadForm" method="post" enctype="multipart/form-data" action="upload.php" style="display:none">
  876.     <input type="hidden" name="preUlDir" id="preUlDir" value="<?php echo cfUTF8Encode(cfResourceRelativePath(cfRGetVar('efCurrentDirectory')));?>">
  877.     <input type="hidden" name="preUlFile" id="preUlFile" value="">
  878.     <input type="hidden" name="overwrite" value="0">
  879.     <input type="hidden" name="resId" value="<?php echo $_SESSION['activeResourceId'];?>">
  880.     </form>
  881.     <?php // Upload form  ?>
  882.     <form name="uploadForm" method="post" enctype="multipart/form-data" action="upload.php">
  883.     <input type="hidden" name="UPLOAD_IDENTIFIER">
  884.     <input type="hidden" name="ulDir" id="ulDir" value="<?php echo cfUTF8Encode(cfResourceRelativePath(cfRGetVar('efCurrentDirectory')));?>">
  885.     <input type="hidden" name="postUlFile" id="postUlFile" value="">
  886.     <input type="hidden" name="resId" value="<?php echo $_SESSION['activeResourceId'];?>">
  887.     <input type="hidden" name="ulTransferId" id="ulTransferId" value="">
  888.     <?php
  889.     // ack JS function
  890.     if($ackJSFunction) echo '<input type="hidden" name="ulAckJSFunction" id="ulAckJSFunction" value="'.$ackJSFunction.'">';
  891.     // File input
  892.     ?>
  893.     <input class="textInput<?php if(cfGetBrowser()=='gecko') echo ' fileInput';// Gecko workaround/file unpload bg is always white?>" type="file" id="ubId" name="ulInput" size="<?php echo $inputWidth;?>">
  894.     <?php
  895.     if($submitButton!='none'){
  896.         // Submit button
  897.         if($submitButton=='enabled')
  898.             echo outButton(cfCaption('genSend'),'javascript:initUpload();',outIcon('ok'),false,'uploadFormSubmitButton');
  899.         else
  900.             echo outButtonDisabled(cfCaption('genSend'),'javascript:initUpload();',outIcon('ok'),false,'uploadFormSubmitButton');
  901.         // Multiple uploads button
  902.         if(!$singleUpload && cfBGetVar('flash')) {
  903.             if($submitButton=='enabled') echo '<br> '.outButton(cfCaption('multiUpload'),'javascript:flashUploadOpen()',outIcon('uploadMult'),false,'flashUploadOpenBt');
  904.             else echo '<br>'.outButtonDisabled(cfCaption('multiUpload'),'javascript:flashUploadOpen()',outIcon('uploadMult'),false,'flashUploadOpenBt');
  905.         }
  906.     }
  907.     // Extra HTML
  908.     echo $extraInnerHTML;
  909.     ?>
  910. </form>
  911. <script type="text/javascript">
  912. var windowId;
  913. function initUpload(){
  914.     if((dgi('ubId').value)=="") {alert('<?php echo cfCaptionJS('explorerUploadNoFile');?>'); return;}
  915.     dgi('preUlFile').value=dgi('ubId').value;
  916.     dgi('postUlFile').value=dgi('ubId').value;
  917.     var dcf=D.comForm;
  918.     if(!dcf) return initUploadProceed('proceed');
  919.     dgi('preUlDir').value=dcf.data1.value;
  920.     dgi('ulDir').value=dcf.data1.value;
  921.     dcf.data2.value=dgi('ubId').value;
  922.     dcf.data3.value='uploadCheckOverwrite';
  923.     asyncSubmit();
  924. }
  925. function initUploadProceed(action,caption){
  926.     if(action=='forbidden') return alert(caption);
  927.     if(action=='confirm' && !confirm(caption)) return;
  928.  
  929.     var now = new Date();
  930. <?php
  931.     if($singleUpload) echo 'windowId="upload'.$_SESSION['activeResourceId']."\";\n"; else echo 'windowId="upload"+now.getTime();';
  932.     // No popups
  933.     if(cfHGetVar('noPopup') && cfTGetVar('frames')){
  934. ?>
  935.     var w=parent.dd.getWndW();
  936.     var h=parent.dd.getWndH();
  937.     var width=220;
  938.     var height=190;
  939.     parent.winOpenLocation("",windowId,"...",winMyId);
  940.     with(parent.win(windowId)){
  941.         moveTo(Math.floor((w-width)/2),Math.floor((h-height)/2));
  942.         resizeInnerTo(width,height); freezeSize(); show(); bringToFront();
  943.     }
  944.     document.uploadForm.target=parent.dgi(windowId+'_if').name;
  945.     document.preUploadForm.target=parent.dgi(windowId+'_if').name;
  946.     document.preUploadForm.submit();
  947. <?php
  948.     // Popups
  949. } elseif(cfTGetVar('frames')) {
  950. ?>
  951.     var w=screen.availWidth;
  952.     var h=screen.availHeight;
  953.     var width=220;
  954.     var height=190;
  955.     window.open("about:blank",windowId,"toolbar=no,location=no,status=no,scrollbars=no,resizable=no,menuBar=no,width="+width+", height="+height+", top="+Math.floor((h-height)/2)+", left="+Math.floor((w-width)/2));
  956.     document.uploadForm.target=windowId;
  957.     document.preUploadForm.target=windowId;
  958.     document.preUploadForm.submit();
  959. <?php
  960. }
  961.     // Frameless display
  962.     else{
  963. ?>
  964.     document.uploadForm.submit();
  965. <?php
  966.     }
  967. ?>
  968. }
  969. function doUploadFile(uploadId){
  970.     if(!uploadId) return;
  971.     dgi('ulTransferId').value=uploadId;
  972.     dgn('UPLOAD_IDENTIFIER').value=uploadId;
  973.     if(dgi('transfersIFrame')) frames["transfersIFrame"].refresh();
  974.     document.uploadForm.submit();
  975. }
  976. function refreshPage(){location=location.href;}
  977. </script>
  978. </div>
  979. <?php
  980.  
  981.  
  982. /**
  983.  * FLASH upload HTML and script
  984.  */
  985. ?>
  986. <script type="text/javascript">
  987. var initFlashUploadDone=0;
  988. function initFlashUpload(vd){
  989.     if(initFlashUploadDone) return;
  990.     initFlashUploadDone=1;
  991.     dgi('htmlUploadStuff').style.display='none';
  992.     dgi('flashUploadStuff').style.display='';
  993. }
  994. function flashUploadOpen(){
  995.     windowId="upload"+(new Date().getTime());
  996.     var width=600;
  997.     var height=200;
  998. <?php
  999.     // No popups
  1000.     if(cfHGetVar('noPopup') && cfTGetVar('frames')){
  1001. ?>
  1002.     parent.winOpenLocation("<?php echo dirname($_SERVER['SCRIPT_NAME']);?>/uploadFlash.php",windowId,"<?php echo cfCaption('genFileUpload');?>",winMyId);
  1003.     with(parent.win(windowId)){resizeInnerTo(width,height); center(); show(); bringToFront();}
  1004. <?php
  1005.     // Popups
  1006. } elseif(cfTGetVar('frames')) {
  1007. ?>
  1008.     var w=screen.availWidth;
  1009.     var h=screen.availHeight;
  1010.     window.open("<?php echo dirname($_SERVER['SCRIPT_NAME']);?>/uploadFlash.php",windowId,"toolbar=no,location=no,status=no,scrollbars=auto,menuBar=no,width="+width+", height="+height+", top="+Math.floor((h-height)/2)+", left="+Math.floor((w-width)/2));
  1011. <?php
  1012. }
  1013.     // Frameless display
  1014.     else{
  1015. ?>
  1016.     document.location="uploadFlash.php";
  1017. <?php
  1018.     }
  1019. ?>
  1020. }
  1021. </script>
  1022. <?php
  1023. //echo outFlashPlayer('/js/upload.swf','flashUpload',0,0,false,false,((cfGetBrowser()=='ie')?'':'style="visibility:hidden"'));
  1024. }
  1025.  
  1026. /**
  1027.  * @desc display subdirectories and upperdir browser
  1028.  *
  1029.  * @param string $dir :
  1030.  * @param array $filesArray : efGetDirContent formated file array
  1031.  * @param string $class : table class
  1032.  * @param integer $rows : number of rows
  1033.  */
  1034. function outDirectoryTable($dir, $filesArray, $class=false,$rows=4,$extraHTML=false,$extraStyle=false){
  1035.     $outputStarted=false;
  1036.  
  1037.     // "Up" control
  1038.     if(cfFileRights($dir."/..",'state')=='authorized' && $dir!='computerRoot') {
  1039.         echo outDivFrame($class,$extraHTML,$extraStyle);
  1040.         if($class) echo '<div class="'.$class.'Header">'; else echo '<div>';
  1041.         echo outThemeImage(outIcon('browse'),false,false,'vertical-align:middle; margin-right:0.5em;').cfCaption('explorerBrowse').'</div>';
  1042.         echo '<table style="width:100%;">';
  1043.         echo '<tr><td align="left">';
  1044.         echo outButton(cfCaption('explorerParentDir'),'javascript:go(\'..\')',outIcon('icoUp'),false,false,false,true).'</td></tr>';
  1045.         $outputStarted=true;
  1046.     }
  1047.  
  1048.     // Sub directories
  1049.     $dirIndex=0;
  1050.     foreach ($filesArray as $value){
  1051.         if($value['type']=='dir' || $value['type']=='drive'){
  1052.             // Frame
  1053.             if(!$outputStarted) {
  1054.                 $outputStarted=true;
  1055.                 if($class) echo outDivFrame($class,$extraHTML,$extraStyle).'<div class="'.$class.'Header">'; else echo outDivFrame($class).'<div>';
  1056.                 echo outImage(outIcon('browse'),false,false,'vertical-align:middle; margin-right:0.5em;').cfCaption('explorerBrowse').'</div>';
  1057.                 echo '<table style="width:100%;">';
  1058.             }
  1059.             if(($dirIndex/$rows)==round($dirIndex/$rows)) echo "<tr>\n";
  1060.             echo '<td align="left" width="'.round((100/$rows),0).'%">';
  1061.  
  1062.             // Folder button
  1063.             $icon=$value['icon'];
  1064.             if($value['type']=='dir') $text=$value['name']; else $text=$value['name'].' '.$value['volumeName'];
  1065.             echo outButton(cfUTF8Encode($text),'javascript:go(\'dirId'.$dirIndex.'\')',$icon,false,false,'style="width:80%"',true);
  1066.             //echo outbt(cfUTF8Encode($text),$icon,'javascript:go(\'dirId'.$dirIndex.'\')',false,false,false,'up','230px','left');
  1067.             echo '<span style="display:none;" id="dirId'.$dirIndex.'">'.cfProtectFilename($value['name'])."</span></td>\n";
  1068.             $dirIndex++;
  1069.             if(($dirIndex/$rows)==round($dirIndex/$rows)) echo "</tr>\n";
  1070.         }
  1071.     }
  1072.     if($dirIndex % $rows > 0){
  1073.         for($i=($dirIndex % $rows); $i<$rows-1; $i++){
  1074.             echo'<td></td>';
  1075.         }
  1076.     }
  1077.     if($outputStarted) echo '</table></div>';
  1078. }
  1079.  
  1080.  
  1081. /**
  1082.  * @desc : multiple file download file list and buttons
  1083.  *
  1084.  * @param string $class : class of list
  1085.  */
  1086.  
  1087. /**
  1088.  * @desc : Multiple file download file list and buttons / playlist
  1089.  *
  1090.  * @param string $class : class of outer HTML frame
  1091.  * @param mixed $showMusicControls : false if not a playlist, 'folder' if folder-browsing music resource (playlist),
  1092.  *             'db' if not folder-browsing music resource (playlist)
  1093.  * @param boolean $compactDisplay: true if captions must be removed from buttons
  1094.  * @param string $extraHTML: outer HTML frame extra HTML
  1095.  * @param string $extraStyle: outer HTML frame extra style
  1096.  * @param string $extraStyleDrop: drop zone frame extra style
  1097.  * @param string $innerFrameClass: inner HTML frame CSS Class
  1098.  * @param array $extraOptions: 'noCollapse'=>1 to forbid toggle collapse button, 'noOuterDiv' not to include outer div
  1099.  * @return string HTML code
  1100.  */
  1101. function outMultipleDownloadList($class, $showMusicControls, $compactDisplay=false,$extraHTML=false, $extraStyle=false, $extraStyleDrop=false, $innerFrameClass=false, $extraOptions=array()){
  1102.     $output='';
  1103.     if(cfRGetVar('mDownloadList') && count(cfRGetVar('mDownloadList'))) $empty=false; else $empty=true;
  1104.  
  1105.     // Main outer div
  1106.     if(!isset($extraOptions['noOuterDiv'])) $output.=outDivFrame($class,$extraHTML,$extraStyle);
  1107.  
  1108.     // Add item to indicate JS wether it's a playlist or not
  1109.     if($showMusicControls) $output.='<p style="display:none" id="mDlPlaylist"/>';
  1110.  
  1111.     // Reloading icon
  1112.     $l=outThemeImage(outIcon('loading'), false, 'id="mdlLoadingIcon"','vertical-align:middle;display:none;margin-right:0.5em');
  1113.  
  1114.     // Play all (music only)
  1115.     if($showMusicControls) {
  1116.         // playlist icon and play all button
  1117.         $l.=outThemeImage(outIcon('icom3u'), false, 'id="mdlIcon"','vertical-align:middle;margin-right:0.5em');
  1118.         $l.=outButton(cfCaption('explorerAudioPlayPlaylist'),'javascript:plPlayAll('.DEFAULT_AUDIO_WINDOW_WIDTH.','.DEFAULT_AUDIO_WINDOW_HEIGHT.')',outIcon('play'),false,'plPlayAllBtE',(($empty)?'style="display:none"':''));
  1119.         $l.=outButtonDisabled(cfCaption('explorerAudioPlayPlaylist'),false,outIcon('play'),false,'plPlayAllBtD',(($empty)?'':'style="display:none"'));
  1120.     }
  1121.     else{
  1122.         // mdl icon
  1123.         $tooltip=(($compactDisplay=='vertical')?' onmouseover="tooltip(this,\''.cfCaption('explorerMultipleDownload').' \'+dgi(\'mDlTotals\').innerHTML,1)"':'');
  1124.         $l.=outThemeImage(outIcon('mdli'), false, 'id="mdlIcon"'.$tooltip,'vertical-align:middle;margin-right:0.5em').' ';
  1125.         // mdl title
  1126.         if($compactDisplay!=='vertical') $l.=(($compactDisplay)?cfCaption('explorerMDShort'):cfCaption('explorerMultipleDownload'));
  1127.  
  1128.         // mdl total size
  1129.         if(cfHGetVar('mDownloadPrecomputeSize')){
  1130.             list($nbFiles,$totalSize)=cfRGetVar('mDownloadTotals');
  1131.             $l.=' <span id="mDlTotals"'.(($compactDisplay=='vertical')?' style="display:none"':'').'> ('.cfCaption('explorerFiles',$nbFiles).' / '.efFileSizeFormat($totalSize).')</span>';
  1132.         }
  1133.     }
  1134.  
  1135.     $r='';
  1136.     // Shuffle playlist
  1137.     if($showMusicControls) {
  1138.         if(isset($extraOptions['m3u']) && cfBGetVar('playlistFormat')) $r.=outButton(false,'javascript:plPlayAll(0,0,\'forceM3U\')',outIcon('m3u'),cfCaption('musicCfgExternal'),'plPlayM3UBt');
  1139.  
  1140.         $r.=outButton('','javascript:plToggleShuffle(\'ns\')',outIcon('random'),cfCaption('explorerShuffle'),'plShuffleBtOn',((!cfRGetVar('shufflePlaylist'))?'style="display:none;margin-right:1em"':'style="margin-right:1em"'));
  1141.         $r.=outButton('','javascript:plToggleShuffle(\'s\')',outIcon('randomNo'),cfCaption('explorerShuffleNo'),'plShuffleBtOff',((!cfRGetVar('shufflePlaylist'))?'style="margin-right:1em"':'style="display:none;margin-right:1em"'));
  1142.     }
  1143.  
  1144.  
  1145.     // if list is not empty, show enabled buttons
  1146.     if(cfRGetVar('mDownloadList') && count(cfRGetVar('mDownloadList'))){
  1147.         if(cfRGetVar('multipleDownloadAllowed')){
  1148.             // Zip download
  1149.             $r.=outButton(((!$compactDisplay)?cfCaption('explorerStartDownload'):''),'javascript:mDownload();',outIcon('mdlS'),(($compactDisplay)?cfCaption('explorerStartDownload'):''),'mDlDownloadE')
  1150.               .outButtonDisabled(((!$compactDisplay)?cfCaption('explorerStartDownload'):''),false,outIcon('dl'),(($compactDisplay)?cfCaption('explorerStartDownload'):''),'mDlDownloadD','style="display:none"');
  1151.             // Bittorrent download (if bittorrent Enabled and not db music playlist)
  1152.             if(cfHiGetVar('bittorrentEnabled') && $showMusicControls!='db')
  1153.                 $r.=outButton(((!$compactDisplay)?cfCaption('bittorrent'):''),'javascript:btDownload();',outIcon('bittorrent'),(($compactDisplay)?cfCaption('bittorrent'):''),'btDlDownloadE')
  1154.                 .outButtonDisabled(((!$compactDisplay)?cfCaption('bittorrent'):''),false,outIcon('bittorrent'),(($compactDisplay)?cfCaption('bittorrent'):''),'btDlDownloadD','style="display:none"');
  1155.         }
  1156.  
  1157.         $r.=outButton(((!$compactDisplay)?cfCaption('explorerClearList'):''),'javascript:mSuppAll();',outIcon('eraser'),(($compactDisplay)?cfCaption('explorerClearList'):''),'mDlClearE','style="margin-left:1em"')
  1158.           .outButtonDisabled(((!$compactDisplay)?cfCaption('explorerClearList'):''),false,outIcon('eraser'),(($compactDisplay)?cfCaption('explorerClearList'):''),'mDlClearD','style="display:none;margin-left:1em"');
  1159.         if($showMusicControls!='db') $r.=outButton(((!$compactDisplay)?cfCaption('explorerAudioSelectAll'):''),'javascript:mAddAll();',outIcon('addMult'),(($compactDisplay)?cfCaption('explorerAudioSelectAll'):''),'mDlAddAllE');
  1160.     }
  1161.     // else, show disabled buttons
  1162.     else{
  1163.         if(cfRGetVar('multipleDownloadAllowed')){
  1164.             // Zip download
  1165.             $r.=outButton(((!$compactDisplay)?cfCaption('explorerStartDownload'):''),'javascript:mDownload();',outIcon('mdlS'),false,'mDlDownloadE','style="display:none"')
  1166.               .outButtonDisabled(((!$compactDisplay)?cfCaption('explorerStartDownload'):''),false,outIcon('dl'),false,'mDlDownloadD');
  1167.             // Bittorrent download (if bittorrent Enabled and not db music playlist)
  1168.             if(cfHiGetVar('bittorrentEnabled') && $showMusicControls!='db')
  1169.                 $r.=outButton(((!$compactDisplay)?cfCaption('bittorrent'):''),'javascript:btDownload();',outIcon('bittorrent'),false,'btDlDownloadE','style="display:none"')
  1170.                   .outButtonDisabled(((!$compactDisplay)?cfCaption('bittorrent'):''),false,outIcon('bittorrent'),false,'btDlDownloadD');
  1171.         }
  1172.         $r.=outButton(((!$compactDisplay)?cfCaption('explorerClearList'):''),'javascript:mSuppAll();',outIcon('eraser'),false,'mDlClearE','style="display:none;margin-left:1em"')
  1173.           .outButtonDisabled(((!$compactDisplay)?cfCaption('explorerClearList'):''),false,outIcon('eraser'),false,'mDlClearD','style="margin-left:1em"');
  1174.         if($showMusicControls!='db') $r.=outButton(((!$compactDisplay)?cfCaption('explorerAudioSelectAll'):''),'javascript:mAddAll();',outIcon('addMult.png'),false,'mDlAddAllE');
  1175.     }
  1176.     // Toggle collapse button
  1177.     if($compactDisplay!=='vertical' && (!$showMusicControls || (!cfIsWII() && !cfRGetVar('inlinePlayer'))) && !isset($extraOptions['noCollapse'])) $r.=outButtonToggleCollapse('mdlInnerFrame','displayMultipleDownload');
  1178.     // Help button
  1179.     $r.=outHelpButton('helpMD');
  1180.  
  1181.  
  1182.  
  1183.     // Header
  1184.     $output.=outFrameHeaderTable($class.'Header',$l,$r,false,' vertical-align:top;white-space:nowrap');
  1185.  
  1186.     // Files frame
  1187.     if($compactDisplay==='vertical')
  1188.         $output.=outCollapsableFrame("mdlInnerFrame", false,'class="'.$innerFrameClass.'"' ,false,false);
  1189.     else
  1190.         $output.=outCollapsableFrame("mdlInnerFrame", 'displayMultipleDownload','class="'.$innerFrameClass.'"');
  1191.  
  1192.     // Music playlist inner part
  1193.     if($showMusicControls){
  1194.         $output.=outDivFrame('frame2','id="mDlPlaylistInnerFrame"');
  1195.         //$output.='<div class="frame2Header">'.cfCaption('musicSelection').'</div>';
  1196.         $output.='<div style="position:relative;width:100%;height:'.DEFAULT_INLINEPLAYER_HEIGHT.'; overflow:auto;'.$extraStyleDrop.'" id="mDlList" class="dropTarget" '.outEHoverFrameAttr().'>';
  1197.         $output.=outMultipleDownloadListInnerHTML();
  1198.         $output.='</div></div>';
  1199.     }
  1200.     // Regular mdl inner part
  1201.     else{
  1202.         $output.='<div style="position:relative;height:8em;text-overflow:ellipsis;overflow:auto;'.$extraStyleDrop.'" id="mDlList" class="dropTarget" '.outEHoverFrameAttr().'>';
  1203.         /**
  1204.          * CONTENT
  1205.          */
  1206.         $output.=outMultipleDownloadListInnerHTML();
  1207.         $output.='</div>';
  1208.     }
  1209.     $output.='</div>';
  1210.     if(!isset($extraOptions['noOuterDiv'])) $output.='</div>'; // end of main outer div
  1211.  
  1212.     // Add frame to draggable items list
  1213.     cfDragAddItem("mDlList",'+NO_DRAG+RECEIVER+AUTOSIZE');
  1214.     return $output;
  1215. }
  1216.  
  1217. /**
  1218.  * @desc : multiple file download file list (used both by outMultipleDownloadList (below)
  1219.  *             and by async call (efMultipleDownloadAdd, efMultipleDownloadSupp, efMultipleDownloadClear))
  1220.  *
  1221.  */
  1222. function outMultipleDownloadListInnerHTML(){
  1223.     $output=''; $i=0;
  1224.     if(cfGetBrowser()=='ie') $w=100; else $w=98;
  1225.     if(cfRGetVar('mDownloadList')){
  1226.         foreach (cfRGetVar('mDownloadList') as $name=>$completeFileName){
  1227.         $output.='<div class="eTC" id="mDlDiv'.$i.'" style="width:'.$w.'%;white-space:nowrap" eH=1>';
  1228.         $output.=outButtonSmall('','javascript:mSupp(\'mDl'.$i.'\')',outIcon('eraser'));
  1229.         if(is_dir($completeFileName)) $icon='/gfx/fi/folder.gif'; else $icon=efIcon($completeFileName);
  1230.         $output.=outImage($icon,false,false,'vertical-align:middle;margin-left:0.5em;');
  1231.         $output.='<span id="mDl'.$i.'" style="margin-left:0.5em">'.cfUTF8Encode($name).'</span></div>';
  1232.         $i++;
  1233.         }
  1234.     }
  1235.     else $output.='<div style="text-align:center; width:'.$w.'%; display:block; position:relative; top:45%">'.cfCaption('explorerNoFile').'</div>';
  1236.     return $output;
  1237. }
  1238.  
  1239. /**
  1240.  * @desc insert div stuff for image preview on view icon hover
  1241.  *
  1242.  * @return srting : HTML code
  1243.  */
  1244. function outFilePreviewDiv(){
  1245.     cfDragAddItem("previewFrame");
  1246.     return '<div id="previewFrame" style="position:absolute;top:-100px;"></div>';
  1247. }
  1248.  
  1249.  
  1250. /*
  1251.  ***************************************************************************************************************************
  1252.  * Image gallery specific HTML controls output scripts
  1253.  ***************************************************************************************************************************
  1254.  */
  1255.  
  1256. /**
  1257.  * @desc Full thumbnails interval selection controls
  1258.  * @param integer $index: index of control set, used if more than one on the page
  1259.  * @param bool $async: true to asynchronously update files
  1260.  * @return string
  1261.  */
  1262. function outExplorerThumbnailsSelector($index=1,$async=false){
  1263.     if(cfIsAsync()) {
  1264.         $r='';
  1265.         $act='';
  1266.         // Show / hide selector control depending of number of files
  1267.         if(isset($_ENV['weezoResEfFiles']['nbFiles']))
  1268.             $act=cfAsyncXMLJSaction('dgi("thumbnailsSelector'.(($index!=1)?$index:'').'").style.display="'.(($_ENV['weezoResEfFiles']['nbFiles']>10)?'':'none').'"');
  1269.     }
  1270.     else
  1271.         $r='<span style="white-space:nowrap'.((cfRGetVar('resourceLayout')=='useInterval' && efDirGetNbOfFiles($_ENV['weezoResEfFiles'])>10)?'':';display:none').'" id="thumbnailsSelector'.(($index!=1)?$index:'').'">';
  1272.  
  1273.     //previous thumbnails set
  1274.     $r.=outExplorerPrevThumbnails($async);
  1275.     // thumbnails 'from - to'
  1276.     $r.=outExplorerThumbnailsSelectList($index,$async);
  1277.     //next thumbnails set
  1278.     $r.=outExplorerNextThumbnails($async);
  1279.  
  1280.     // If async, return code needed for async update of controls
  1281.     if(cfIsAsync()) return cfAsyncXMLInnerHTMLbyId($r,'thumbnailsSelector'.(($index!=1)?$index:'')).$act;
  1282.     // Else, return controls embeded into known span
  1283.     return $r.'</span>';
  1284.  
  1285. }
  1286.  
  1287. /**
  1288.  * @desc Previous thumbnails button. Button is enabled or disabled depending on thumbnailsIndex value
  1289.  *
  1290.   * @return string : HTML code
  1291.  */
  1292. function outExplorerPrevThumbnails($async=false){
  1293.     if($async) $async=',1';
  1294.     if(cfRGetVar('itemsPerPage') && 0+cfRGetVar('thumbnailsIndex')>0)
  1295.         return outButton('', 'javascript:goThumbnail('.max(0,0+cfRGetVar('thumbnailsIndex')-cfRGetVar('itemsPerPage')).$async.');',outIcon('prev'));
  1296.     else return outButtonDisabled('',false,outIcon('prev'));
  1297. }
  1298.  
  1299. /**
  1300.  * @desc Next thumbnails button. Button is enabled or disabled depending on thumbnailsIndex, itemsPerPage and number of files values
  1301.  *
  1302.   * @return string : HTML code
  1303.  */
  1304. function outExplorerNextThumbnails($async=false){
  1305.     if($async) $async=',true';
  1306.     if(cfRGetVar('itemsPerPage') && cfRGetVar('thumbnailsIndex')+cfRGetVar('itemsPerPage')<efDirGetNbOfFiles($_ENV['weezoResEfFiles']))
  1307.         return outButton('', 'javascript:goThumbnail('.((int)cfRGetVar('thumbnailsIndex')+(int)cfRGetVar('itemsPerPage')).$async.');',outIcon('next'));
  1308.     else return outButtonDisabled('',false,outIcon('next'));
  1309. }
  1310.  
  1311. /**
  1312.  * @desc Display a <select> control with "from-to" thumbnails list
  1313.  *
  1314.   * @return string : HTML code
  1315.   * @param  $index optional : control index if multiple select list displayed in same page
  1316.  */
  1317. function outExplorerThumbnailsSelectList($index=1,$async=false){
  1318.     if($async) $async=',true';
  1319.     $output='<select name="newRange" id="efNewRange_'.$index.'" size="1" style="vertical-align:middle;width:8.5em" onchange="goThumbnail(this.value'.$async.')">';
  1320.     $nbTotalImages=efDirGetNbOfFiles($_ENV['weezoResEfFiles']);
  1321.  
  1322.     $compact=cfTGetVar('compactDisplay')||(cfRGetVar('fileTypeFilter')!=='image');
  1323.  
  1324.     $nbGroups=((cfRGetVar('itemsPerPage'))?efDirGetNbOfFiles($_ENV['weezoResEfFiles'])/cfRGetVar('itemsPerPage'):1);
  1325.     $output.='<option value="">'.cfCaption('explorerItemsPerPage').'</option>';
  1326.     $output.='<option value="ipp10">10</option>';
  1327.     $output.='<option value="ipp20">20</option>';
  1328.     $output.='<option value="ipp50">50</option>';
  1329.     $output.='<option value="ipp100">100</option>';
  1330.     $output.='<option value="ipp0">'.cfCaption('genAll').'</option>';
  1331.     if(cfRGetVar('itemsPerPage')>0){
  1332.         $output.='<option value=""> </option>';
  1333.         for($i=0;$i<$nbGroups;$i++){
  1334.             if($i*cfRGetVar('itemsPerPage')==cfRGetVar('thumbnailsIndex')) $output .= '<option selected '; else $output .= '<option ';
  1335.             $output .= 'value="'.($i*cfRGetVar('itemsPerPage')).'">';
  1336.             $from=cfUTF8Encode(1+$i*cfRGetVar('itemsPerPage'));
  1337.             $to=cfUTF8Encode(((($i+1)*cfRGetVar('itemsPerPage'))>$nbTotalImages)?$nbTotalImages:(($i+1)*cfRGetVar('itemsPerPage')));
  1338.             if($compact) $output.=$from.' - '.$to.'</option>';
  1339.             else $output .= cfCaption('explorerImagesFromTo',$from,$to).'</option>';
  1340.         }
  1341.     }
  1342.     $output .= "</select>\n";
  1343.     return $output;
  1344. }
  1345.  
  1346. /**
  1347.  * @desc Display thumbnail <img>
  1348.  *
  1349.  * @param array $file
  1350.  * @param integer $fileIndex: index in
  1351.  * @param string $extraStyle
  1352.  * @param string $extraHTML
  1353.  * @param mixed $draggable: true, false, 'div' (to embed draggable image into a div)
  1354.  *
  1355.  */
  1356. function outThumbnail($file, $fileIndex, $extraStyle='', $extraHTML=false, $draggable=true){
  1357.     // Cache vars
  1358.     static $fade=-1; static $tnMWC=0; static $tnMHC=0;
  1359.  
  1360.     if($fade==-1) {
  1361.         $fade=cfBGetVar('imgFadeSteps');
  1362.         $tnMHC=$tnMWC=efThumbnailsMaxWidth();
  1363.     }
  1364.  
  1365.     $output='';$tnW=0;
  1366.  
  1367.     // Use icon instead of actual image (music icon...)
  1368.     if(isset($file['thumbnailIcon'])){
  1369.         $src=$file['thumbnailIcon'];
  1370.         if(isset($file['width'])) $tnW=$file['width'];
  1371.         if(isset($file['height'])) $tnH=$file['height'];
  1372.     }
  1373.     // Use pre-generated tn
  1374.     elseif(isset($file['thumbnail'])){
  1375.         // Compute thumbnail dimensions, using source image width & height
  1376.         if($tnMWC || $tnMHC){
  1377.             if(isset($file['width']) && isset($file['height']) && $file['width']*$file['height']!=0){
  1378.                 list($tnW,$tnH)=cfThumbnailDimensions($file['width'],$file['height'],$tnMWC,$tnMHC);
  1379.             }
  1380.             // If unknown image w or h, get dimension from thumbnail file
  1381.             elseif (file_exists($file['thumbnail'])){
  1382.                 list($tnW, $tnH, $type, $attr) = getimagesize($file['thumbnail']);
  1383.                 if($tnW*$tnH>0) list($tnW,$tnH)=cfThumbnailDimensions($tnW,$tnH,$tnMWC,$tnMHC);
  1384.                 else {
  1385.                     $tnW=$tnMWC;
  1386.                     $tnH=$tnMWC*3/4;
  1387.                 }
  1388.             }
  1389.             else {
  1390.                 $tnW=$tnMWC;
  1391.                 $tnH=$tnMWC*3/4;
  1392.             }
  1393.         }
  1394.         // output image
  1395.         $src=cfExtImage($file['thumbnail'],$tnW,$tnH);
  1396.     }
  1397.     // Directly extract from file
  1398.     else{
  1399.         if(efFileType($file)=='image'){
  1400.             list($tnW, $tnH, $type, $attr) = getimagesize($file['completeFileName']);
  1401.             list($tnW,$tnH)=cfThumbnailDimensions($tnW,$tnH,$tnMWC,$tnMHC);
  1402.         }
  1403.         else {$tnW=$tnMWC;$tnH=$tnMHC;}
  1404.         $src=cfExtImage($file['completeFileName'],$tnW,$tnH);
  1405.     }
  1406.     // If preview image displayed in resource, add link to thumbnail
  1407.     if(cfRGetVar('previewDisplay')) {
  1408.         $extraStyle.=';cursor:pointer';
  1409.         $extraHTML.=' onclick="preview(\'id'.$fileIndex.'\')"';
  1410.         if(cfRGetVar('fileViewAllowed')) $extraHTML.=' onDblClick="view(\'id'.$fileIndex.'\')"';
  1411.     }
  1412.     elseif(cfRGetVar('fileViewAllowed')) {
  1413.         $extraStyle.=';cursor:pointer';
  1414.         $extraHTML.=' onclick="view(\'id'.$fileIndex.'\')"';
  1415.     }
  1416.  
  1417.     if($tnW>0) $dimStyle='width:'.floor($tnW).';height:'.floor($tnH).';'; else $dimStyle='';
  1418.     // Embed image into div
  1419.     if($draggable==='div'){
  1420.         $extraStyle.=';position:relative;height:'.$tnMHC.';padding-top:'.floor(($tnMHC-$tnH)/2);
  1421.         $output='<div name="_id'.$fileIndex.'" id="_id'.$fileIndex.'" style="'.$extraStyle.'" '.$extraHTML.'><img src="'.$src.'" alt="" style="'.$dimStyle.(($fade)?'visibility:hidden" onload="fade(this)"':'').'></div>';
  1422.     }
  1423.     else{
  1424.         if($fade && !$draggable) $extraHTML.=' onload="fade(this)"';
  1425.         if($fade) $extraStyle.=';visibility:hidden';
  1426.         //if($fade) $extraStyle.=';'.outCssOpacity(1);
  1427.         $output='<img name="_id'.$fileIndex.'" style="'.$dimStyle.$extraStyle.'" '.$extraHTML.' src="'.$src.'" alt="">';
  1428.     }
  1429.  
  1430.  
  1431.     // Add image to dragable items list
  1432.     if($draggable) cfDragAddItem("_id".$fileIndex,'+CURSOR_HAND+ELASTIC+TRANSPARENT+INERTIA'.(($fade && $draggable===true)?'+IMGFADEIN':''));
  1433.     return $output."\n";
  1434. }
  1435.  
  1436. /**
  1437.  * @desc Return name/date/size sort controls
  1438.  *
  1439.  * @return string
  1440.  */
  1441. function outSortControls(){
  1442.     $r='<span class="smallFont">'.cfCaption('explorerFilename').outImage(outIcon('sup'),'javascript:srt(\'name\',\'asc\');',false,'margin-left:5px').outImage(outIcon('sdown'),'javascript:srt(\'name\',\'desc\')',false,'margin-right:1em');
  1443.     $r.=cfCaption('genSize').outImage(outIcon('sup'),'javascript:srt(\'size\',\'asc\');',false,'margin-left:5px').outImage(outIcon('sdown'),'javascript:srt(\'size\',\'desc\')',false,'margin-right:1em');
  1444.     $r.=cfCaption('explorerDate').outImage(outIcon('sup'),'javascript:srt(\'date\',\'asc\');',false,'margin-left:5px').outImage(outIcon('sdown'),'javascript:srt(\'date\',\'desc\')',false).'</span>';
  1445.     return $r;
  1446. }
  1447.  
  1448. /*
  1449.  ***************************************************************************************************************************
  1450.  * Audio files explorer specific HTML controls output scripts
  1451.  ***************************************************************************************************************************
  1452.  */
  1453.  
  1454. function outWaitCursorMask(){
  1455.     $output='<div id="waitCursorMask" style="position:absolute; background: white; top:0;left:0;width:99%;height:100%;filter:Alpha(opacity=1, style=0); -moz-opacity:0.01; -khtml-opacity:0.01; opacity:0.01; cursor:wait; display:none"> </div>';
  1456.     $output.='<script type="text/javascript" language="javascript">function setWaitCursor(){dgi("waitCursorMask").style.display="block";}'."\n";
  1457.     return $output.='function removeWaitCursor(){document.getElementById("waitCursorMask").style.display="none";}</script>'."\n";
  1458. }
  1459.  
  1460.  
  1461. /*
  1462.  ***************************************************************************************************************************
  1463.  * Other...
  1464.  ***************************************************************************************************************************
  1465.  */
  1466.  
  1467. /**
  1468.  * @desc return HTML code for theme selection for given level, through included POST form
  1469.  *
  1470.  * @return string : HTML code
  1471.  * @param string $standaloneID: id of control, used when displaying multiple standalone theme controls
  1472.  * @param string $standaloneDefaultTheme: name of default selected theme, used when themeLevel is "standalone"
  1473.  * @param string $themeLevel : 'general', 'user', 'resource', 'standalone'
  1474.  * @param boolead $targetParentFrame : true if form is submited in parent frame (/index.php)
  1475.  * @param mixed $displayLabel: true if "Theme" label is displayed, false if not, 'noSmallFont' if smallFont class should not be applied
  1476.  * @param boolead $displayIcon: true if form is submited in parent frame (/index.php)
  1477. */
  1478. function outThemeSelectionControl($themeLevel, $targetParentFrame=false,$method='POST',$extraHTML='',$displayLabel=true, $displayIcon=true, $standaloneDefaultTheme='', $standaloneID=false){
  1479.     global $useWin;
  1480.     if($themeLevel=='general')            $theme=cfGGetVar('theme');
  1481.     elseif($themeLevel=='standalone')    $theme=$standaloneDefaultTheme;
  1482.     else $theme=cfActualTheme();
  1483.     $dir=cfAppDocRoot().'/themes';
  1484.  
  1485.     // Form
  1486.     $output= '<form action="/index.php" method="'.$method.'" enctype="multipart/form-data" name="themeForm"'.($targetParentFrame?' target="_parent"':'').' style="display:inline"'.' '.$extraHTML.">\n";
  1487.  
  1488.     if($themeLevel=='general')     $output.='<input type="text" name="themeLevel" value="general" style="display:none">';
  1489.     elseif ($themeLevel=='user') $output.='<input type="text" name="themeLevel" value="user" style="display:none">';
  1490.     elseif ($themeLevel=='resource') $output.='<input type="text" name="themeLevel" value="resource" style="display:none">';
  1491.  
  1492.     // Display control
  1493.     // icon
  1494.     if($displayIcon) $output .= outImage(outIcon('theme'),false, false,'margin-right:0.5em;vertical-align:middle');
  1495.     // Label
  1496.     if($displayLabel) $output .= '<span'.(($displayLabel=='noSmallFont')?'':' class="smallFont"').' style="margin-right:1em;vertical-align:middle;">'.cfCaption('genTheme').'</span>';
  1497.     // Select
  1498.     $output .= '<select class="textinput smallFont" name="themeUpdate"'.(($standaloneID)?' id="'.$standaloneID.'"':'').' size="1" onChange="if(W.themeSelectionControlChanged) themeSelectionControlChanged(this.value, this); else document.themeForm.submit()" style="vertical-align:middle">'."\n";
  1499.     // Display "no theme" item (only if $theme parameter is not set)
  1500.     if($themeLevel!='general'){
  1501.         if($theme) $output .= '<option value="noTheme">'.cfCaption('adminNoTheme').'</option>';
  1502.         else $output .= '<option selected value="noTheme">'.cfCaption('adminNoTheme').'</option>';
  1503.     }
  1504.     // Create themes select
  1505.     $themes=cfMGetVar('weezoThemes');
  1506.     foreach ($themes as $name=>$data) if($name!='skins/default' && !isset($data['private'])){
  1507.         if($name==$theme) $output .= '<option selected value="'.cfUTF8Encode($name).'">'.cfUTF8Encode($name).'</option>';
  1508.         else $output .= '<option value="'.cfUTF8Encode($name).'">'.ucfirst(cfUTF8Encode($name)).'</option>';
  1509.     }
  1510.     $output .= '</select>';
  1511.     $output.="</form>\n";
  1512.     return $output;
  1513.  }
  1514.  
  1515. /**
  1516.  * @desc return HTML code for HTTPXmlRequest js inclusion (now included in common.js)
  1517.  *
  1518.  * @return string : HTML code
  1519. */
  1520. function outInsertHTTPXmlRequest(){}
  1521.  
  1522. /**
  1523.  * @desc display robot-safe clickable email adress
  1524.  *
  1525.  * @param string $eMail : email adress
  1526.  */
  1527. function outMailSafe($eMail,$echoOutput=1){
  1528.     $o='<a href="javascript:void(0)" onclick="javascript:location.href=\'mail\'+\'to:'.substr($eMail,0,3).'\'+\''.substr($eMail,3).'\'"><span>'.substr($eMail,0,4).'</span><span>'.substr($eMail,4)."</span></a>\n";
  1529.     if($echoOutput) echo $o;else return $o;
  1530. }
  1531.  
  1532. /**
  1533.  * @desc draw a progress bar
  1534.  *
  1535.  * @param float $percent : percentage 0-1 (set to -1 to set error)
  1536.  * @param string $width : bar width
  1537.  * @param string $caption : bar caption
  1538.  * @param string $id : item Id
  1539.  * @param string $extraHTML : extra HTML
  1540.  * @return string : HTML code
  1541.  */
  1542. function outProgressBar($percent,$width='100%',$caption=false,$id=false,$extraHTML=false,$invert=false, $extraStyle=false){
  1543.     /* code:
  1544.     <span class=""
  1545.     */
  1546.     $output='';
  1547.     if(!is_numeric($percent)) $percent=-1;
  1548.     if($percent>1) $percent=1;
  1549.     // Outer bar
  1550.     if($percent==-1 || $invert) $output.='<span';
  1551.     else $output.='<div';
  1552.     $output.=' style="width:'.$width.';'.(($extraStyle)?$extraStyle:'').'" class="progressOuter"'.(($id)?' id="'.$id.'"':'').(($extraHTML)?' '.$extraHTML:'').'>';
  1553.     // Inner bar
  1554.     if($percent==1) $output.='<span style="display:block;position:relative;width:100%" class="progressInner"'.(($id)?' id="'.$id.'_inner"':'').'></span>';
  1555.     else $output.='<div style="position:absolute;'.(($invert)?'right':'left').':0px; width:'.(($percent==-1)?'0':(round(100*$percent))).'%" class="progressInner"'.(($id)?' id="'.$id.'_inner"':'').'></div>';
  1556.     // Text
  1557.     if($caption) $output.='<div class="progressTextO"><div class="progressText"'.(($id)?' id="'.$id.'_text"':'').'>'.$caption.'</div></div>';
  1558.  
  1559.     if($percent==-1 || $invert) $output.='</span>'; else $output.='</div>';
  1560.     return $output;
  1561. }
  1562.  
  1563. /**
  1564.  * @desc Wiimote keys management
  1565.  *
  1566.  * @param string $scrollItem : JS item to be scrolled with arrows (leave blank for body)
  1567.  */
  1568. function outKeysManager($scrollItem='document.body'){
  1569.     if(!cfIsWII()) return;
  1570. ?>
  1571. <script language="javascript" type="text/javascript">
  1572. var kmInterval=false;
  1573. var documentOnKeydown = document.onkeydown;
  1574. var documentOnKeyup = document.onkeyup;
  1575. var zoomIn=false;
  1576. var keyActDown=0;
  1577. var scrollInt=50;
  1578. function keydown(e){
  1579.     if(documentOnKeydown) {if(!documentOnKeydown(e)) return;}
  1580.     if(e) kc=e.which; else {if(window.event) kc=window.event.keyCode; else return;}
  1581.  
  1582.     if(false && (kc==170 || kc==27) && !zoomIn) {
  1583.         if(keyActDown==176){
  1584.             if(window.winMe) winMe.reload();
  1585.         }
  1586.         if(keyActDown==177){
  1587.             if(window.winMe) winMe.toggleState();
  1588.         }
  1589.         else{
  1590.             if(dgi("helpDiv") && dgi("helpDiv").innerHTML!="") {
  1591.                 dgi("helpDiv").innerHTML="";
  1592.             }
  1593.             else{
  1594.                 if(window.winMe) winMe.closeMe();
  1595.                 else{
  1596.                     if(!window.winScript) window.close();
  1597.                 }
  1598.             }
  1599.         }
  1600.         return;
  1601.     }
  1602.     if(kc==175) W.setTimeout("scroll('up',7)",scrollInt);
  1603.     if(kc==176) W.setTimeout("scroll('down',7)",scrollInt);
  1604.     if(kc==178) W.setTimeout("scroll('left',7)",scrollInt);
  1605.     if(kc==177) W.setTimeout("scroll('right',7)",scrollInt);
  1606.  
  1607.     if(false && kc==171 || kc==79) {
  1608.         if(!zoomIn && window.optionKeyPressed) optionKeyPressed();
  1609.         zoomIn=false;
  1610.     }
  1611.     if(false && kc==174) zoomIn=true;
  1612.     keyActDown=kc;
  1613. }
  1614.  
  1615. function scroll(dir,step){
  1616.     if(dir=='down') <?php echo $scrollItem;?>.scrollTop+=Math.pow(2,Math.min(step,5));
  1617.     if(dir=='up') <?php echo $scrollItem;?>.scrollTop-=Math.pow(2,Math.min(step,5));
  1618.     if(dir=='left') <?php echo $scrollItem;?>.scrollLeft-=Math.pow(2,Math.min(step,5));
  1619.     if(dir=='right') <?php echo $scrollItem;?>.scrollLeft+=Math.pow(2,Math.min(step,5));
  1620.     if(step>0) window.setTimeout("scroll('"+dir+"',"+(step-1)+")",scrollInt);
  1621. }
  1622. function keyup(e){
  1623.     keyActDown=0;
  1624.     //dgi("keysU").innerHTML+=kc+'<br>';
  1625.     //if(kmInterval!==false) window.clearInterval(kmInterval);
  1626.     //kmInterval=false;
  1627.     if(e) kc=e.which; else {if(window.event) kc=window.event.keyCode; else return;}
  1628.  
  1629.     if(kc==175) {
  1630.         if(window.keyUp) keyUp();
  1631.     }
  1632.     if(kc==176 || kc==76) {
  1633.         if(window.keyDown)  keyDown();
  1634.     }
  1635.     if(kc==178) {
  1636.         if(window.keyLeft) keyLeft();
  1637.     }
  1638.     if(kc==177) {
  1639.         if(window.keyRight) keyRight();
  1640.     }
  1641.  
  1642.     if(documentOnKeyup) documentOnKeyup(e);
  1643. }
  1644. document.onkeydown=keydown;
  1645. document.onkeyup=keyup;
  1646. </script>
  1647. <?php
  1648. }
  1649.  
  1650. /**
  1651.  * @desc return CSS/style code for opacity
  1652.  *
  1653.  * @param integer $percent : opacity (0-100)
  1654.  */
  1655. function outCssOpacity($percent){
  1656.     $percent=round($percent);
  1657.     return ((cfGetBrowser()=='ie')?'_filter:Alpha(Opacity='.$percent.');':'').'opacity:'.($percent/100).';';
  1658. }
  1659.  
  1660. /**
  1661.  * @desc Return single ETC line
  1662.  *
  1663.  * @param string $id : line id
  1664.  * @param string $tagExtraHTML : <tr> extra HTML inside tag
  1665.  * @param mixed $innerHTML : content
  1666.  * @param integer $index : line index
  1667.  * @return string : HTML code
  1668.  */
  1669. function outETC($id, $tagExtraHTML, $innerHTML, $index, $useDIV=false){
  1670.     if($useDIV) return '<div id="'.$id.'" class="eTC" eH=1 '.$tagExtraHTML.' '.((cfGetBrowser()!='ie' && $index%2==0)?'lang="i"':'').'>'.$innerHTML.'</div>';
  1671.  
  1672.     if(cfGetBrowser()=='ie' || $index%2==0) $del='td'; else $del='th';
  1673.     $output ='<tr id="'.$id.'" class="eTC" eH=1 '.$tagExtraHTML.' '.((cfGetBrowser()!='ie' && $index%2==0)?'lang="i"':'').'>';
  1674.     $output.='<'.$del.' class="eTCLeft">'.((is_array($innerHTML) && count($innerHTML)>1)?$innerHTML[0]:' ').'</'.$del.'>';
  1675.     $output.='<'.$del.'>'.((is_array($innerHTML))?$innerHTML[min(1,count($innerHTML)-1)]:' ').'</'.$del.'>';
  1676.     $output.='<'.$del.' class="eTCRight">'.((is_array($innerHTML) && count($innerHTML)==3)?$innerHTML[2]:' ').'</'.$del."></tr>\n";
  1677.     return $output;
  1678. }
  1679.  
  1680. /**
  1681.  * @desc  Insert HTML code for a button
  1682.  * @param string $caption : button's caption (utf-8 encoded)
  1683.  * @param string $img : optional : path to button's image
  1684.  * @param string $href : optional : link href
  1685.  * @param string $id : optional : button's ID
  1686.  * @param string $title : optional : button's title
  1687.  * @param string $extraHTML : optional : extra HTML code included in button definition
  1688.  * @param mixed $width : optional : button's width : false = auto, integer = fixed width, array(minWidth, maxWidth) : min/max width
  1689.  * @param string $state : optional : buton state : "on" (button pressed = activated), "up" (normal), "off" (disabled)
  1690.  *                 set to 'style="width:XXpx;text-align:XXX"' to define a fixed-width button
  1691.  * @param boolean $forceFullDisplay : optional : display button's caption even for compact themes
  1692.  * @return void
  1693.  *
  1694. */
  1695. function outBt($caption, $img=false, $href=false, $id=false, $title=false, $extraHTML=false, $state="up", $width=false, $textAlign=false, $forceFullDisplay=false){
  1696.  
  1697.     if(cfBGetVar('output')=='xhtml-mp') return '<a class="bt"'.(($extraHTML)?$extraHTML:'').' href="'.$href.'">'.(($img)?'<img src="'.$img.'" alt=""/>':'').$caption.'</a>';
  1698.  
  1699.     //Format : <fieldset class="bt"><legend></legend><a class="up/on/off" href="" title=""><div><b><IMG/><s>TEXT</s></b><u> </u><i> </i></div></a><q></q></fieldset>
  1700.  
  1701.     // Corrects Width for IE (remove aproximate icon Width
  1702.     if($width && cfGetBrowser()=='ie'){
  1703.         $units=substr($width,-2);
  1704.         if($units=='px' || $units=='em' || $units=='pt'){
  1705.             $width=substr($width,0,strlen($width)-2);
  1706.             if($units=='em') $width=(max($width-2,0)).$units; else $width=(max($width-16,0)).$units;
  1707.         }
  1708.     }
  1709.  
  1710.     // Theme specific button
  1711.     if(cfTGetVar('buttonFunction') && !isset($_ENV['weezo']['buttonFunction']))
  1712.         $_ENV['weezo']['buttonFunction'] = create_function('$caption,$href,$img,$title,$id,$extraHTML,$forceFullDisplay', cfTGetVar('buttonFunction'));
  1713.     if(isset($_ENV['weezo']['buttonFunction'])) return $_ENV['weezo']['buttonFunction']($caption,$href,$img,$title,$id,$extraHTML,$forceFullDisplay);
  1714.  
  1715.     if(cfTGetVar('compactDisplay') && !$forceFullDisplay && $img!==false){
  1716.         if(!$title) $title=$caption;
  1717.         $caption='';
  1718.     }
  1719.  
  1720.     // Button "frame"
  1721.     $output ="\n<fieldset".(($id)?' id="'.$id.'"':'').(($extraHTML)?' '.$extraHTML:'').' class="bt">';
  1722.     $output.='<legend>'.(($state=='off')?'':$href).'</legend>'; // Store href for disabled button
  1723.     if(!$href) $href='javascript:return';
  1724.  
  1725.     // Action
  1726.     $output.='<a class="'.$state.'" href="'.$href.'"'.(($title)?' title="'.$title.'"':'').'>';
  1727.     $output.='<div'.(($width|| $textAlign)?' style="'.(($width)?'width:'.$width.'px;':'').(($textAlign)?'text-align:'.$textAlign:'').'"':'').'><b>';
  1728.  
  1729.     // Icon
  1730.     if(cfFileExtension($img)=='png' && !cfBGetVar('png')) {
  1731.         $output.='<span style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.$img.');';
  1732.         if(strlen($caption)>0) $output.='margin-right:0.4em;';
  1733.         $output.='"></span>';
  1734.     }
  1735.     else {
  1736.         $output.='<img alt="" src="';
  1737.         if($caption) $mr='margin-right:0.4em;'; else $mr='';
  1738.         if($img) $output.=$img.'" style="'.$mr.'"'; else $output.='/gfx/v.gif"';
  1739.         $output.='>';
  1740.     }
  1741.     // Caption
  1742.     if($caption) $output.='<s'.(($width && cfGetBrowser()=='ie')?' style="'.'width:'.$width.'px"':'').'>'.$caption.'</s>';
  1743.     elseif (cfGetBrowser()=='ie') $output.='<s> </s>';
  1744.     else $output.='<s style="margin-right:-0.2em"> </s>';
  1745.     return $output.="</b><u> </u><i> </i></div></a><q></q></fieldset>\n";
  1746.  
  1747.     if(cfIsInApp() && cfGetBrowser()=='ie' && stripos(($_SERVER['HTTP_USER_AGENT']), "msie 7.0")!==false && $caption=='')
  1748.         return $output.'<span> </span></b><u> </u></a>';
  1749.     return $output.'<span style="position:relative;min-width:80px">a'.str_replace(' ',' ',$caption).'</span></b><u> </u></a>';
  1750. }
  1751.  
  1752. /**
  1753.  * @desc Insert Resource configuration button
  1754.  *
  1755.  */
  1756. function outResourceConfigBt($showCaption=true){
  1757.     if(cfIsWII()) return false;
  1758.     if(!cfRGetVar('definition','configFile') && !file_exists(dirname($_SERVER['SCRIPT_FILENAME'].'/config.php'))) return;
  1759.  
  1760.     // Configuration script URL
  1761.     // Note: limitedConfig is indicative, actual configuration access rights are not based on it
  1762.     $configScript=dirname($_SERVER['PHP_SELF']).'/'.((cfRGetVar('definition','configFile'))?cfRGetVar('definition','configFile'):'config.php?limitedConfig=1');
  1763.  
  1764.     $output=outButton(($showCaption)?cfCaption('genParameters'):'','javascript:configureResource()',outIcon('gears'),(!$showCaption)?cfCaption('genParameters'):'');
  1765.     $output.="\n<script type=\"text/javascript\">function configureResource(){\n";
  1766.     $output.="var winConfId=\"configWindow".$_SESSION['activeResourceId']."\";\n";
  1767.     $output.="if(window.beforeConfigureResource) beforeConfigureResource();"; // If a function called "beforeConfigureResource" is present, execute
  1768.     if(cfTGetVar('frames')){
  1769.         $output.='parent.winOpenLocation("'.$configScript.'",winConfId,"'.cfCaptionJS('genParameters').'",winMyId);';
  1770.         $output.="\nwith(parent.win(winConfId)){\n";
  1771.         //$output.='resizeInnerTo('.$width.','.$height.');'."\n";
  1772.         $output.='show();activate();resizable(false);reloadable(false)}'."\n";
  1773.     }
  1774.     else {
  1775.         $output.='document.location="'.$configScript.'";';
  1776.     }
  1777.     //}    else
  1778.     //    $output.='window.open("'.$configScript.'","configWindow'.$_SESSION['activeResourceId'].'","toolbar=no,location=no,status=yes,resizable=yes,menuBar=no,width='.$width.', height='.$height.', top="+Math.floor((screen.availHeight-'.$height.')/2)+", left="+Math.floor((screen.availWidth-'.$width.')/2));';
  1779.     $output.="}</script>\n";
  1780.     return $output;
  1781. }
  1782.  
  1783. /**
  1784.  * @desc Load a file from an URL, and display loading progress bar
  1785.  *
  1786.  * @param string $url
  1787.  * @param string $localCompleteFilename
  1788.  * @param boolean $showCancelButton
  1789.  * @return boolean true on success
  1790.  */
  1791. function outLoadFileProgress($url, $localCompleteFilename, $showCancelButton=true){
  1792.     function outLFPupdatePage($id,$text){
  1793.         if($id) echo '<script type="text/javascript">dgi("'.$id.'").innerHTML="'.str_replace('"','\\"',$text).'"</script>';
  1794.         else echo '<script type="text/javascript">'.$text.'</script>';
  1795.     flush();
  1796. }
  1797.  
  1798.     // Display progress bar
  1799. ?>
  1800. <script type="text/javascript">function uPB(pc){progressSetPerc("pBar",pc);progressSetText("pBar",pc+"%")}
  1801. </script>
  1802. <div id="progress" style="text-align:center">
  1803. <?php echo outProgressBar(0,'100%','0%','pBar'); ?>
  1804. </div>
  1805. <br>
  1806. <?php
  1807.     if($showCancelButton)    echo '<center id="cancelButtonOuter">'.outButton(cfCaption('genCancel'),'javascript:wl.UICommand(\'close\')',outIcon('cancel'),false,'cancelButton','style="margin-bottom:5px"').'</center>';
  1808. ?>
  1809. <form name="proceedForm" method="POST" action="" style="display:none"><input name="doUpdate" value="download"></form>
  1810. <?php
  1811.     flush();
  1812.     if(file_exists($localCompleteFilename)) @unlink($localCompleteFilename);
  1813.  
  1814.     // Max 2 redirections
  1815.     $proceed=2;
  1816.     while($proceed){
  1817.         if(!($handle=cfSocketHTTPRequest($url,7,false,$foo1,$foo2,false,true))) return false;
  1818.         $response='';
  1819.         while(strlen($response)<1023 && !feof($handle)) $response .= fread($handle, 1024);
  1820.  
  1821.         $pos=strpos($response,"\r\n\r\n");
  1822.         if($pos === false){
  1823.             fclose($handle);
  1824.             displayErrorPage();
  1825.         }
  1826.         $header=substr($response,0,$pos);
  1827.         $response=substr($response,$pos+4);
  1828.  
  1829.         $headers = array();
  1830.         $lines = explode("\r\n", $header);
  1831.         $fSize=0;
  1832.         if(count($lines)==0) displayErrorPage();
  1833.  
  1834.         // HTTP response code
  1835.         $responseCode=substr($lines[0],9,3);
  1836.  
  1837.         // Seek file size or redirection
  1838.         foreach($lines as $value){
  1839.             if(strtolower(substr($value,0,15))=='content-length:') $fSize=trim(substr($value,15));
  1840.             if(strtolower(substr($value,0,9))=='location:') $redir=trim(substr($value,9));
  1841.         }
  1842.         // If redirection
  1843.         if(isset($redir)) {
  1844.             $proceed--;
  1845.             if($proceed<0) return false;
  1846.             if(substr($redir,0,1)=='/') {
  1847.                 $url=substr($url,0,strpos($url,'/',10)).$redir;
  1848.             }
  1849.             else $url=$redir;
  1850.             unset($redir);
  1851.         }
  1852.         // ! 200 OK
  1853.         elseif($responseCode!='200') displayErrorPage();
  1854.         // No redirection and response code 200 OK
  1855.         else $proceed=0;
  1856.     }
  1857.  
  1858.     // Proceed Download
  1859.     $handlew = fopen($localCompleteFilename, "w");
  1860.     if(!$handlew) {fclose($handle);return false;}
  1861.     $i=-1;
  1862.     fwrite($handlew,$response);
  1863.     $dlSize=strlen($response);
  1864.     while (!feof($handle)) {
  1865.         $response=fread($handle, 8192);
  1866.         fwrite($handlew,$response);
  1867.         $i++;$dlSize+=strlen($response);
  1868.         if($i%9==0) outLFPupdatePage(false,'uPB('.floor(100*$dlSize/$fSize).');');
  1869.     }
  1870.     outLFPupdatePage(false,'uPB(100);');
  1871.     fclose($handlew);
  1872.     fclose($handle);
  1873.     return true;
  1874. }
  1875.  
  1876. /**
  1877.  * @desc Return HTML for a list of big icons
  1878.  *
  1879.  * @param array $list: (link,image,caption)
  1880.  * @return string
  1881.  */
  1882. function outIconsList($list){
  1883.     $output='';
  1884.     foreach ($list as $icon){
  1885.         $output.='<fieldset class="iconDiv" style="border:0;text-align:center;position:relative;display:inline"><a class="icon" style="width:70;height:70;color:inherit !important" onclick="'.$icon['link'].'"><img src="'.$icon['image'].'"><br>';
  1886.         $output.='<div style="position:relative">';
  1887.         $output.='<span class="iconCS" style="left:-1;top:0">'.$icon['caption'].'</span>';
  1888.         $output.='<span class="iconCS" style="left:1;top:0">'.$icon['caption'].'</span>';
  1889.         $output.='<span class="iconCS" style="top:-1;left:0">'.$icon['caption'].'</span>';
  1890.         $output.='<span class="iconCS" style="top:1;left:0">'.$icon['caption'].'</span>';
  1891.         $output.='<span class="iconCS" style="top:1;left:1">'.$icon['caption'].'</span>';
  1892.         $output.='<span class="iconC" style="top:0;left:0">'.$icon['caption'].'</span>';
  1893.         $output.="</div></a></fieldset>\n";
  1894.     }
  1895.     $output.='<script type="text/javascript">function outIconListAlign(){var n,l=D.getElementsByTagName("fieldset");for(var i=0;i<l.length;i++) if(l[i].className=="iconDiv") {n=l[i].firstChild.lastChild;';
  1896.     if(cfGetBrowser()=='ie') $output.='n.style.left=-0.5*n.firstChild.offsetWidth';
  1897.     else $output.='n.style.left=(n.offsetWidth-n.firstChild.offsetWidth)/2';
  1898.     $output.='}} outIconListAlign();</script>';
  1899.     return $output;
  1900. }
  1901.  
  1902. /**
  1903.  * @desc Return script required for RSA ciphering
  1904.  * @param string mode: 'auto' to determine actual ciphering from protocole
  1905.  * @param bool $doesCipher: return true if text will actually be RSA ciphered
  1906.  *
  1907.  * @return string
  1908.  */
  1909. function outRSAScripts($mode='auto',&$doesCipher=null){
  1910.     function lRSAKP(){
  1911.         if(!cfGGetVar('loginKeyLength')) return array('keyLength' => 0);
  1912.         // Read file
  1913.         if(!file_exists(cfAppDataDir().'/RSAKey.cnf')){
  1914.             cfLog('login.php: Missing RSAKey.cnf file. Relaunch application to generate file.',LOG_ER);
  1915.             return false;
  1916.         }
  1917.         $kp=parse_ini_file(cfAppDataDir().'/RSAKey.cnf');
  1918.         if(!isset($kp['keyLength']) || !isset($kp['modulo']) || !isset($kp['publicExponent']) || !isset($kp['privateExponent'])){
  1919.             cfLog('login.php: corrupted RSAKey.cnf file. Delete file and relaunch application.',LOG_ER);
  1920.             return false;
  1921.         }
  1922.         // Set maxDigits
  1923.         if($kp['keyLength']<=128) $kp['maxDigits']=19;
  1924.         elseif($kp['keyLength']<=384) $kp['maxDigits']=57;
  1925.         elseif($kp['keyLength']<=512) $kp['maxDigits']=76;
  1926.         elseif($kp['keyLength']<=1024) $kp['maxDigits']=154;
  1927.         else $kp['maxDigits']=308;
  1928.         return $kp;
  1929.     }
  1930.  
  1931.     $doesCipher=true;
  1932.     if($mode=='auto'){
  1933.         if(cfGGetVar('protocol')=='https') $doesCipher=false;
  1934.         elseif(!cfGGetVar('encryptPassword')||
  1935.             (cfGGetVar('disablePasswordCipheringForSlowJSDevices') && cfBGetVar('slowJS'))) $doesCipher=false;
  1936.         elseif (!($RSAKeyPair = lRSAKP())) $doesCipher=false;
  1937.     }
  1938.     elseif (!($RSAKeyPair = lRSAKP())) $cipher=false;
  1939.  
  1940.     $output='<script type="text/javascript">';
  1941.     if(!$doesCipher) $output.='function RSACrypt(plainText,percNode,callback) {callback(plainText)}</script>';
  1942.     else{
  1943.         $output.='var keyLength='.$RSAKeyPair['keyLength'].',';
  1944.         $output.='keyModulo="'.$RSAKeyPair['modulo'].'",';
  1945.         $output.='keyPExp="'.$RSAKeyPair['publicExponent'].'",';
  1946.         $output.='keyMaxDigits='.$RSAKeyPair['maxDigits'].';';
  1947.         $output.='</script>';
  1948.         $output.=cfScriptLink('BigInt-RSA.js');
  1949.     }
  1950.     return $output;
  1951. }
  1952.  
  1953. /**
  1954.  * @desc Display a progress bar and generate video thumbnails
  1955.  *
  1956.  * @param string $caption
  1957.  * @param string $icon
  1958.  * @param integer $total
  1959.  * @param integer $standalone: 0 to in to integrate HTML head and body, 1 to integrate only progress box, 2 to integrate only progress bar
  1960.  * @param array $options:
  1961.  *             'display'=>'%' to display progress percentage or 'size' to display dl/totalsize
  1962.  *             'suspendSession'=>true to suspend current session during download
  1963.  */
  1964. function outSyncProgress($caption=false,$icon=false,$total=100,$standalone=1,$options=array()){
  1965.     require_once(INCLUDE_DIR.'explorerFunctions.php');
  1966.     $options+=array('display'=>'%');
  1967.     if($caption===false) $caption=cfCaption('transferCfgProgress');
  1968.     if($icon===false) $icon=outIcon('blankFile');
  1969.  
  1970.     $_ENV['outSyncProgress']['standalone']=$standalone;
  1971.     $_ENV['outSyncProgress']['total']=$total;
  1972.     $_ENV['outSyncProgress']['display']=$options['display'];
  1973.  
  1974.     /**
  1975.      * Display synchronous monitoring stuff
  1976.      */
  1977.  
  1978.     // Page header
  1979.     if($standalone===0){
  1980.         if(cfIsMobile()) mfInsertHead(); else cfInsertHEAD();
  1981.         echo '<body>';
  1982.     }
  1983.  
  1984.     // Progress indocator (mobile
  1985.     if(cfIsMobile()){
  1986.         require_once(INCLUDE_DIR.'mobileFunctions.php');
  1987.         echo mfListTable('id="syncProgMon"');
  1988.         echo mfListItem('',(($icon)?'<img src="'.$icon.'" style="width:32px;height:32px">':''),false,'<div id="progTxt">'.$caption.'</div>',false,'<div id="progPerc">0%</div>',false);
  1989.         echo '</table>';
  1990. ?>
  1991. <script type="text/javascript">
  1992. function oSPU(t,p){if(p) dgi('progPerc').innerHTML=p+'%'}
  1993. </script>
  1994. <?php
  1995.     }
  1996.     // Mask & progress indicator (computer)
  1997.     else{
  1998.         if($standalone<2){
  1999. ?>
  2000. <div id="syncProgMon">
  2001. <div class="mask"> </div>
  2002. <div style="position:absolute;top:50%;left:50%"><div class="popup" style="width:24em;left:-12em;top:-4em">
  2003. <?php echo outFrameHeaderTable('popupHeader',outImage(outIcon('loading'),false,false,'vertical-align:middle;margin-right:0.5em').$caption,outImage($icon,false,false,'vertical-align:middle'));?>
  2004. <br>
  2005. <center><?php
  2006.         }
  2007.         // Progress bar
  2008.         echo outProgressBar(0,'80%','0/'.$total,'syncProg');
  2009.  
  2010.         if($standalone<2){
  2011. ?></center>
  2012. <br>
  2013. </div></div></div>
  2014. <?php
  2015.         }
  2016. ?>
  2017. <script type="text/javascript">
  2018. function oSPU(txt,perc){progressSetText('syncProg',txt);progressSetPerc('syncProg',perc);}
  2019. </script>
  2020. <?php
  2021.     }
  2022.  
  2023.     set_time_limit(0);
  2024.     if(isset($options['suspendSession'])) {
  2025.         cfSessionPause();
  2026.         $_ENV['outSyncProgress']['suspendSession']=1;
  2027.     }
  2028. }
  2029.  
  2030. /**
  2031.  * @desc Update progress bar
  2032.  *
  2033.  * @param number $nb: progress, or "done" if done
  2034.  * @param number $total
  2035.  */
  2036. function outSyncProgressUpdate($nb,$total=false){
  2037.     // Done
  2038.     if($nb==='done'){
  2039.         if($_ENV['outSyncProgress']['standalone']==0) die('<script type="text/javascript">D.location.href=D.location</script>');
  2040.         if(isset($_ENV['outSyncProgress']['suspendSession'])) cfSessionRestart();
  2041.         set_time_limit(ini_get('max_execution_time'));
  2042.  
  2043.         // Remove progress indicator
  2044.         if(cfIsMobile())
  2045.             echo '<script type="text/javascript">dgi("syncProgMon").style.display="none"</script>';
  2046.         else
  2047.             echo '<script type="text/javascript">if(dgi("syncProgMon")) removeNode(dgi("syncProgMon")); else removeNode(dgi("syncProg"))</script>';
  2048.         unset($_ENV['outSyncProgress']);
  2049.         return;
  2050.     }
  2051.  
  2052.     // Update total if needed
  2053.     if($total!==false) $_ENV['outSyncProgress']['total']=$total;
  2054.     if($_ENV['outSyncProgress']['display']=='%') $txt=floor(100*$nb/$_ENV['outSyncProgress']['total']).' %'; else $txt=efFileSizeFormat($nb).' / '.efFileSizeFormat($_ENV['outSyncProgress']['total']);
  2055.     echo '<script type="text/javascript">oSPU("'.$txt.'",'.@floor(100*$nb/$_ENV['outSyncProgress']['total']).');</script>';
  2056.     flush();
  2057.  
  2058.     // Ping app
  2059.     cfPingUpdate();
  2060. }
  2061.  
  2062. /**
  2063.  * @desc Insert Accordion
  2064.  *
  2065.  * @param array $tabs: array of tabs ('caption'=>, 'src'=>)
  2066.  * @param integer $width
  2067.  * @param integer $height
  2068.  * @param array options: 'hideFolded'=>0/1 : if 1, set display:none on folded iframes, 'callback'=>: callback on fold/unfold completition
  2069.  */
  2070. function outAccordion($tabs,$width,$height,$options=array()){
  2071. ?>
  2072. <style type="text/css">
  2073. .accordion{position:absolute;top:0}
  2074. .accordionHandle{float:left;width:30px;position:relative;overflow:hidden;border-right:1px solid #555;border-left:1px solid #555;white-space:nowrap;height:100%;overflow:hidden;background:url(/themes/accordionHandle.gif);cursor:pointer;margin-right:-3;text-align:center}
  2075. .accordionCaption{filter:'progid:DXImageTransform.Microsoft.BasicImage(rotation=3)';font-weight:bold;font-family:Tahoma;font-size:21px;color:white;white-space:nowrap;position:absolute;bottom:30;left:0}
  2076. .accordionIcon{margin-top:5}
  2077. .accordionHandleIcon{position:absolute;bottom:4;left:5}
  2078. .iframeMask{position:absolute;width:100%;height:100%;background:red;display:block;}
  2079. </style>
  2080. <div id="accordionOuter" style="width:<?php echo $width;?>;height:<?php echo $height;?>;position:absolute;overflow:hidden">
  2081. <?php
  2082.     $selected=false;$nb=0;
  2083.     // Find selected tab
  2084.     foreach ($tabs as $id=>$tab){
  2085.         if($selected===false || isset($tab['selected'])) $selected=$nb;
  2086.         $nb++;
  2087.     }
  2088.     // Insert items
  2089.     $nb=0;
  2090.     foreach ($tabs as $id=>$tab){
  2091. ?><div id="<?php echo $id;?>" class="accordion" style="width:<?php echo $width;?>;height:<?php echo $height;?>;visibility:hidden" onclick="accordionToggle(this.id)""><?php
  2092.     ?><div class="accordionHandle"><?php
  2093.         ?><div class="accordionCaption"><?php echo $tab['caption'];?></div><?php
  2094.         ?><img class="accordionHandleIcon" src="<?php
  2095.     if($nb<=$selected) echo outIcon('right');
  2096.     else echo outIcon('left');
  2097.         ?>" alt=""><?php
  2098.     if(isset($tab['icon'])) echo outImage($tab['icon'],false,'class="accordionIcon"');
  2099.     ?></div><?php
  2100.     ?><iframe name="<?php echo $id;?>" style="height:100%" src="<?php echo $tab['src'];?>" frameborder="0" scrolling="<?php if(!isset($tab['scroll']) || $tab['scroll']==false) echo 'no'; else echo 'auto'; ?>"></iframe></div>
  2101. <?php
  2102.         $nb++;
  2103.     }
  2104. ?>
  2105. </div>
  2106. <script type="text/javascript">
  2107. var accordionTabs=new Array(<?php
  2108.     $o='';
  2109.     foreach ($tabs as $id=>$tab) $o.=($o?',':'').'"'.$id.'"';
  2110.     echo $o;
  2111. ?>);
  2112. <?php if(isset($options['callback'])) echo 'var accordionCallback="'.$options['callback'].'"';?>;
  2113. var accordionSelected=<?php echo (int)$selected;?>;
  2114. var accordionHideFolded=<?php echo (int)@$options['hideFolded'];?>;
  2115. var accordionHandleWidth=dgi(accordionTabs[0]).firstChild.offsetWidth-1, accordionMove, accordionOuterWidth=<?php echo $width;?>-1;
  2116. function accordionInit(){
  2117.     var s=0,off=0,id,nb=accordionTabs.length;
  2118.     for(var i=0;i<nb;i++){
  2119.         id=accordionTabs[i];
  2120.         dgi(id).firstChild.nextSibling.style.width=accordionOuterWidth-accordionHandleWidth*nb;
  2121.         if(accordionHideFolded && accordionSelected!=i) dgi(id).getElementsByTagName('IFRAME')[0].style.visibility='hidden';
  2122.         if(s){
  2123.             off=accordionOuterWidth-accordionHandleWidth*(nb-i);
  2124.             with(dgi(id).style) {left=off;visibility='visible'}
  2125.         }
  2126.         else {
  2127.             with(dgi(id).style) {left=off;visibility=''}
  2128.             if(accordionSelected==i) {
  2129.                 if(i==0) dgi(id).firstChild.style.cursor='default'
  2130.                 s=1;
  2131.             }
  2132.             else off+=accordionHandleWidth;
  2133.         }
  2134.     }
  2135. }
  2136. function accordionPosFromId(id){for(var i=0;i<accordionTabs.length;i++) if(accordionTabs[i]==id) return i;}
  2137. function accordionRefresh(){
  2138.     dgi(accordionTabs[accordionSelected]).getElementsByTagName('IFRAME')[0].style.visibility='visible';
  2139.     //dgi(accordionTabs[accordionSelected]).getElementsByTagName('SPAN')[0].style.display='none';
  2140. }
  2141. // start
  2142. function accordionToggle(id){
  2143.     var i,ns=accordionPosFromId(id),nb=accordionTabs.length;
  2144.     //dgi(accordionTabs[ns]).getElementsByTagName('IFRAME')[0].style.display='block';
  2145.     if(accordionHideFolded) setTimeout('accordionRefresh()',10)
  2146.     if(ns==accordionSelected && ns>0) ns--;
  2147.     for(i=0;i<nb;i++) with(dgi(accordionTabs[i]).firstChild){
  2148.         style.cursor=(i==ns&&i==0)?'default':'pointer';
  2149.         firstChild.nextSibling.src=(i<=ns)?'<?php echo outIcon('right');?>':'<?php echo outIcon('left');?>';
  2150.     }
  2151.     accordionMove={};
  2152.  
  2153.     if(ns>accordionSelected){
  2154.         for(i=accordionSelected+1;i<=ns;i++) accordionMove[accordionTabs[i]]=i*accordionHandleWidth;
  2155.     }
  2156.     else if(ns<accordionSelected){
  2157.         for(i=ns+1;i<=accordionSelected;i++) accordionMove[accordionTabs[i]]=accordionOuterWidth-(accordionTabs.length-i)*accordionHandleWidth;
  2158.     }
  2159.     else return;
  2160.     if(W.accordionCallback) eval(accordionCallback+"(accordionTabs[ns],accordionTabs[accordionSelected])");
  2161.     accordionSelected=ns;
  2162.     accordionAnim(20);
  2163. }
  2164. // anim
  2165. function accordionAnim(step){
  2166.     // done
  2167.     if(!step){
  2168.         for(var tid in accordionMove) dgi(tid).style.left=accordionMove[tid];
  2169.         if(accordionHideFolded) for(var i=0;i<accordionTabs.length;i++) if(i!=accordionSelected) dgi(accordionTabs[i]).getElementsByTagName('IFRAME')[0].style.visibility='hidden';
  2170.         return;
  2171.     }
  2172.     for(var tid in accordionMove) {
  2173.         dgi(tid).style.left=Math.floor(accordionMove[tid]+(actualOffsetLeft(dgi(tid))-accordionMove[tid])*3/4);
  2174.     }
  2175.     setTimeout("accordionAnim("+(step-1)+")",10);
  2176. }
  2177.  
  2178. accordionInit();
  2179. </script>
  2180. <?php
  2181. }
  2182.  
  2183.  
  2184. /*
  2185.  ***************************************************************************************************************************
  2186.  * Asynchronous controls
  2187.  ***************************************************************************************************************************
  2188.  */
  2189.  
  2190.  
  2191. /**
  2192.  * @desc insert an image and / or a caption depending on $controlDefinitionArray definition
  2193.  *
  2194.  * @param array $controlDefinitionArray
  2195.  *            $controlDefinitionArray is a one or two elements array of image or caption definition (icd)
  2196.  *            (if $controlDefinitionArray is a string then it is treated as a one-element array)
  2197.  *            - if icd is false, don't display anything
  2198.  *            - if documentRoot/icd or resource's directory/icd is an image, display this image
  2199.  *            - else display icd as a caption
  2200.  *
  2201.  * @param alignLabelControl or alignControlLabel $align : defines wether control is located right or left of caption/image
  2202.  *            use this parameter to insert right or left margins
  2203.  * @return string: HTML output
  2204.  */
  2205. function outDisplayLabelAndOrImage($controlDefinitionArray,$align){
  2206.     $output='';
  2207.     if($align==alignLabelControl) $alignStyle="margin-right:1em;"; else $alignStyle="margin-left:1em;";
  2208.     // Check $controlDefinitionArray format
  2209.     if(!is_array($controlDefinitionArray)) {$item1=$controlDefinitionArray;$item2=false;}
  2210.     elseif (count($controlDefinitionArray)==1) {list($item1)=$controlDefinitionArray;$item2=false;}
  2211.     elseif (count($controlDefinitionArray)==2) {list($item1,$item2)=$controlDefinitionArray;}
  2212.     else return false;
  2213.  
  2214.     if($item1){
  2215.         // Check if item1 is an image
  2216.         if(file_exists(cfAppDocRoot().$item1)) $output.=outImage($item1,false,false,$alignStyle);
  2217.         // Else item1 is a caption
  2218.         else  $output.='<span  style="'.$alignStyle.'">'.$item1.'</span>';
  2219.     }
  2220.     if($item2){
  2221.         // Check if item2 is an image
  2222.         if(file_exists(cfAppDocRoot().$item2)) $output.='<img alt="" style="'.$alignStyle.'" src="'.$item2.'">';
  2223.         elseif(isset($resourceData['type']) && file_exists(cfAppDocRoot().'/res/'.$resourceData['type'].'/'.$resourceData['subType'].'/'.$item2)) $output.='<img alt="" style="'.$alignStyle.'" src="/res/'.$resourceData['type'].'/'.$resourceData['subType'].'/'.$item2.'">';
  2224.         // Else item2 is a caption
  2225.         else  $output.='<span  style="'.$alignStyle.'">'.$item2.'</span>';
  2226.     }
  2227.     // Insert spacing after caption/image if needed
  2228.     $output.="\n";
  2229.     if($align==alignControlLabel && ($item1 || $item2)){
  2230.         $item1=strtolower($item1);
  2231.         $item2=strtolower($item2);
  2232.         if(($item1 && (substr($item1,-4)=='<br>' || substr($item1,-5)=='<br/>'))) return true;
  2233.         if(($item2 && (substr($item2,-4)=='<br>' || substr($item2,-5)=='<br/>'))) return true;
  2234.         $output.="  \n";
  2235.     }
  2236.     return $output;
  2237. }
  2238.  
  2239. /**
  2240.  * @desc Initialize data array used by ouControl function
  2241.  *
  2242.  * @param array $data
  2243.  */
  2244. function outControlSetData($data){
  2245.     global $outCD;
  2246.     global $outControlAsyncResponse;
  2247.     $outControlAsyncResponse=''; // Asynchronous response (used to indicate whether passed value is OK or not)
  2248.     $outCD=$data;
  2249. }
  2250.  
  2251. /**
  2252.  * @desc Get new data array after outControl processing
  2253.  *
  2254.  * @param array $data
  2255.  * @return true if data has been modified
  2256.  */
  2257. function outControlGetData(&$data){
  2258.     global $outCD;
  2259.     $modified=false;
  2260.     foreach ($outCD as $key=>$value) if(!isset($data[$key]) || $outCD[$key]!=$data[$key]) {$modified=true;break;}
  2261.     if(!$modified) foreach ($data as $key=>$value) if(!isset($outCD[$key])) {$modified=true;break;}
  2262.     $data=$outCD;
  2263.     return $modified;
  2264. }
  2265.  
  2266. /**
  2267.  * @desc process a data item:
  2268.  *        - set default value
  2269.  *        - modify value if POST parameter received
  2270.  *        - display control for user input
  2271.  *
  2272.  * @param string $dataName : name of data
  2273.  * @param integer $dataType : type of data :
  2274.  *         - dataText : text data
  2275.  *         - dataPassword : MD5 hashed password
  2276.  *         - dataNumeric : numeric data
  2277.  *         - dataList : fixed list of data
  2278.  *         - dataBoolean boolean
  2279.  *         - dataFolderPath : path to folder
  2280.  *         - dataFilePath : path to file
  2281.  *         - dataImage : image filename
  2282.  *
  2283.  * @param mixed $defaultValue: default value of data
  2284.  * @param mixed $constraints: authorized values for data (see below). No constraint if set to false
  2285.  * @param mixed $controlDefinition: user control definition (caption, icons,... see below). Control is not displayed if set to false
  2286.  * @param array $extraOptions
  2287.  * @return boolean : true if OK, false if function parameters are not correct
  2288.  */
  2289. function outControl($dataName, $dataType, $defaultValue, $constraints, $controlDefinition=false,$extraOptions=array()){
  2290.     global $outCD;
  2291.     global $outControlAsyncResponse;
  2292.     static $init=0;
  2293.     $output='';
  2294.  
  2295.     /*
  2296.     ***************************************************************************************************************************
  2297.     * SET DEFAULT VALUE
  2298.     ***************************************************************************************************************************
  2299.     */
  2300.     if(!isset($outCD[$dataName])) $outCD[$dataName]=$defaultValue;
  2301.  
  2302.     /*
  2303.     ***************************************************************************************************************************
  2304.     * PROCESS POST COMMANDS
  2305.     ***************************************************************************************************************************
  2306.     */
  2307.  
  2308.     // Set new value if passed
  2309.     if(isset($_POST['asUpdtName']) && $_POST['asUpdtName']==$dataName) {
  2310.         $requestedValue=cfUTF8Decode($_POST['asUpdtValue'],true,false,false);
  2311.         // If true, indicate that an error has been encountered while modifying the value
  2312.         $failed=false;
  2313.  
  2314.         switch($dataType){
  2315.             // Text data
  2316.             case dataText:
  2317.                 if(is_array($constraints) && count($constraints)==2){
  2318.                     list($nbMin,$nbMax)=$constraints;
  2319.                     if(($nbMin===false || strlen($requestedValue)>=$nbMin) && ($nbMax===false || strlen($requestedValue)<=$nbMax)) $outCD[$dataName]=$requestedValue;
  2320.                     else $failed=true;
  2321.                 }
  2322.                 elseif (!$constraints) $outCD[$dataName]=$requestedValue;
  2323.                 break;
  2324.  
  2325.             // Password
  2326.             case dataPassword:
  2327.                 if(is_array($constraints) && count($constraints)==2){
  2328.                     list($nbMin,$nbMax)=$constraints;
  2329.                     if(($nbMin===false || strlen($requestedValue)>=$nbMin) && ($nbMax===false || strlen($requestedValue)<=$nbMax)) $outCD[$dataName]=md5($requestedValue);
  2330.                     else $failed=true;
  2331.                 }
  2332.                 elseif (!$constraints) $outCD[$dataName]=md5($requestedValue);
  2333.                 break;
  2334.  
  2335.             // Numeric data
  2336.             case dataNumeric:
  2337.                 if(is_numeric($requestedValue) && is_array($constraints) && count($constraints)==2){
  2338.                     list($nbMin,$nbMax)=$constraints;
  2339.                     if(($nbMin===false || $requestedValue>=$nbMin) && ($nbMax===false || $requestedValue<=$nbMax)) $outCD[$dataName]=$requestedValue;
  2340.                     else $failed=true;
  2341.                 }
  2342.                 elseif (is_numeric($requestedValue) && !$constraints) $outCD[$dataName]=$requestedValue;
  2343.                 else $failed=true;
  2344.                 break;
  2345.             // List
  2346.             case dataList:
  2347.                 if(is_array($constraints) && in_array($requestedValue,$constraints)) $outCD[$dataName]=$requestedValue;
  2348.                 else $failed=true;
  2349.                 break;
  2350.             // Boolean data
  2351.             case dataBoolean:
  2352.                 if($requestedValue=='true' || $requestedValue=='on') $outCD[$dataName]=true;
  2353.                 else $outCD[$dataName]=false;
  2354.                 break;
  2355.             // File or folder path
  2356.             case dataFolderPath:
  2357.             case dataFilePath:
  2358.                 $requestedValue=str_replace('\\\\','/',$requestedValue);
  2359.                 if(substr($requestedValue,-1)=='/') $requestedValue=substr($requestedValue,0,strlen($requestedValue)-1);
  2360.                 if($dataType==dataFolderPath){
  2361.                     if(is_dir($requestedValue)) $outCD[$dataName]=$requestedValue;
  2362.                     elseif($requestedValue==cfCaption('explorerComputerRoot') && $constraints!='noComputerRoot') $outCD[$dataName]='computerRoot';
  2363.                     else $failed=true;
  2364.                 }
  2365.                 elseif ($dataType==dataFilePath){
  2366.                     if(is_file($requestedValue)) $outCD[$dataName]=$requestedValue;
  2367.                     else $failed=true;
  2368.                 }
  2369.                 if(cfIsSubDir(cfAppDataRootDir(),$outCD[$dataName])) $outCD[$dataName]='*appDir*'.substr($outCD[$dataName],strlen(cfAppDataRootDir()));
  2370.                 break;
  2371.             // Image
  2372.             // Constraints: array(path to images, array(allowed extensions)) | path to images
  2373.             case dataImage;
  2374.                 if(file_exists(((is_array($constraints))?$constraints[0]:$constraints)).'/'.str_replace('/','',str_replace('\\','',$requestedValue))) $outCD[$dataName]=str_replace('/','',str_replace('\\','',$requestedValue));
  2375.                 else $failed=true;
  2376.  
  2377.                 break;
  2378.         }
  2379.         // Asynchronous response
  2380.         $outControlAsyncResponse=cfAsyncXMLJSaction('dgn("asUpdt'.$dataName.'").style.color="'.(($failed)?'red':'').'"');
  2381.     }
  2382.  
  2383.     /*
  2384.     ***************************************************************************************************************************
  2385.     * DISPLAY CONTROL
  2386.     ***************************************************************************************************************************
  2387.     */
  2388.     if($controlDefinition){
  2389.         // Insert javascript and form
  2390.         if(!$init){
  2391.             $init=1;
  2392.             $output.='<script type="text/javascript">var asUpdtTO;';
  2393.             // Async update data
  2394.             $output.='function asUpdt(dataName,dataValue,delay){';
  2395.             $output.='clearTimeout(asUpdtTO);if(delay){asUpdtTO=setTimeout("asUpdt(\'"+dataName+"\',\'"+dataValue.replace(/\'/g,"\\\\\'")+"\')",1000);return}';
  2396.             $output.='asUpdtTO=0;dgn("asUpdtName").value=dataName;dgn("asUpdtValue").value=dataValue;asyncSubmitForm("asUpdtForm");if(W.asUpdtFunction) asUpdtFunction(dataName,dataValue);}';
  2397.             // Show update image popup
  2398.             $output.='function asUpdtImg(dataName){maskShow(false,true);var node=dgi("asUpdtImg"+dataName); if(node) node.parentNode.removeChild(node); if(!dgi("asUpdtImgMV"+dataName)){document.body.insertBefore(node,maskNode()); node.id="asUpdtImgMV"+dataName;} else node=dgi("asUpdtImgMV"+dataName); node.style.visibility="hidden";node.style.display="";maskMoveAbove(node);$(node).e.center();fade(node,0,1);node.focus()}';
  2399.             // Hide update image popup
  2400.             $output.='function asUpdtImgH(dataName){maskHide(1);var node=dgi("asUpdtImgMV"+dataName); node.style.display="none";}';
  2401.             // Select an update image
  2402.             $output.='function asUpdtImgS(dataName,dataValue){asUpdtImgH(dataName);var src=dgn("asUpdt"+dataName).firstChild.src; dgn("asUpdt"+dataName).firstChild.src=src.substr(0,src.lastIndexOf("/")+1)+dataValue;asUpdt(dataName,dataValue)}';
  2403.             // Update image esc detection
  2404.             $output.='function asUpdtImgKP(dataName,evt){if(!evt) evt=W.event;if(evt.keyCode==27) return asUpdtImgH(dataName)}';
  2405.             $output.='</script>';
  2406.             $output.='<form id="asUpdtForm" method="POST" action="'.$_SERVER['PHP_SELF'].'" style="display:none"><input type="text" name="asUpdt" value="1"><input type="text" name="asUpdtName"><input type="text" name="asUpdtValue"></form>';
  2407.         }
  2408.         switch($dataType){
  2409.             // TEXT OR NUMERIC DATA
  2410.             // Control definition :
  2411.             //     array(input lenght, $controlDefinitionArray) : text input (size=input lenght) with image and/or caption
  2412.             //     array($controlDefinitionArray,input lenght) : image and/or caption with text input (size=input lenght)
  2413.             //     array($controlDefinitionArray,input lenght, $controlDefinitionArray) : image and/or caption with text input (size=input lenght) and image and/or caption
  2414.             case dataText:
  2415.             case dataNumeric:
  2416.                 if(!is_array($controlDefinition)) $controlDefinition=array($controlDefinition,45); // default control : set size at 45
  2417.                 if(count($controlDefinition)==2){
  2418.                     list($item1,$item2)=$controlDefinition;
  2419.                     // Textbox - caption
  2420.                     if(is_numeric($item1)){
  2421.                         $output.='<input onKeyUp="asUpdt(\''.$dataName.'\',this.value,1)" onChange="asUpdt(\''.$dataName.'\',this.value)" type="text" class="textInput" name="asUpdt'.$dataName.'" size="'.$item1.'" value="'.str_replace('"','"',cfUTF8Encode($outCD[$dataName])).'">';
  2422.                         $output.=outDisplayLabelAndOrImage($item2,alignControlLabel);
  2423.                     }
  2424.                     // Caption - Textbox
  2425.                     elseif (is_numeric($item2)){
  2426.                         $output.=outDisplayLabelAndOrImage($item1,alignLabelControl);
  2427.                         $output.='<input onKeyUp="asUpdt(\''.$dataName.'\',this.value,1)" onChange="asUpdt(\''.$dataName.'\',this.value)" type="text" class="textInput" name="asUpdt'.$dataName.'" size="'.$item2.'" value="'.str_replace('"','"',cfUTF8Encode($outCD[$dataName])).'">';
  2428.                     }
  2429.                 }
  2430.                 // Caption - Textbox - Caption
  2431.                 elseif (count($controlDefinition)==3 && is_numeric($controlDefinition[1])){
  2432.                         list($item1,$item2,$item3)=$controlDefinition;
  2433.                         $output.=outDisplayLabelAndOrImage($item1,alignLabelControl);
  2434.                         $output.='<input onKeyUp="asUpdt(\''.$dataName.'\',this.value,1)" onChange="asUpdt(\''.$dataName.'\',this.value)" type="text" class="textInput" name="asUpdt'.$dataName.'" size="'.$item2.'" value="'.str_replace('"','"',cfUTF8Encode($outCD[$dataName])).'">';
  2435.                         $output.=outDisplayLabelAndOrImage($item3,alignControlLabel);
  2436.                 }
  2437.             break;
  2438.             // PASSWORD
  2439.             // See TEXT for control definition
  2440.             case dataPassword:
  2441.                 if(!is_array($controlDefinition)) $controlDefinition=array($controlDefinition,45); // default control : set size at 45
  2442.                 if(count($controlDefinition)==2){
  2443.                     list($item1,$item2)=$controlDefinition;
  2444.                     // Textbox - caption
  2445.                     if(is_numeric($item1)){
  2446.                         $output.='<input onKeyUp="asUpdt(\''.$dataName.'\',this.value,1)" onChange="asUpdt(\''.$dataName.'\',this.value)" type="password" class="textInput" name="asUpdt'.$dataName.'" size="'.$item1.'" value="">';
  2447.                         $output.=outDisplayLabelAndOrImage($item2,alignControlLabel);
  2448.                     }
  2449.                     // Caption - Textbox
  2450.                     elseif (is_numeric($item2)){
  2451.                         $output.=outDisplayLabelAndOrImage($item1,alignLabelControl);
  2452.                         $output.='<input onKeyUp="asUpdt(\''.$dataName.'\',this.value,1)" onChange="asUpdt(\''.$dataName.'\',this.value)" type="password" class="textInput" name="asUpdt'.$dataName.'" size="'.$item2.'" value="">';
  2453.                     }
  2454.                 }
  2455.                 // Caption - Textbox - Caption
  2456.                 elseif (count($controlDefinition)==3 && is_numeric($controlDefinition[1])){
  2457.                         list($item1,$item2,$item3)=$controlDefinition;
  2458.                         $output.=outDisplayLabelAndOrImage($item1,alignLabelControl);
  2459.                         $output.='<input onKeyUp="asUpdt(\''.$dataName.'\',this.value,1)" onChange="asUpdt(\''.$dataName.'\',this.value)" type="password" class="textInput" name="asUpdt'.$dataName.'" size="'.$item2.'" value="">';
  2460.                         $output.=outDisplayLabelAndOrImage($item3,alignControlLabel);
  2461.                 }
  2462.             break;
  2463.  
  2464.             // VALUES LIST : 2 types of controls : <select> droplist or radio buttons
  2465.             // Control definition :
  2466.             // <select> :
  2467.             //        array($controlDefinitionArray, array of items, $controlDefinitionArray)
  2468.             //         items : array(value, caption)
  2469.             //  Radio buttons:
  2470.             //        array of items
  2471.             //         items : array(left-side $controlDefinitionArray, value, right-side $controlDefinitionArray)
  2472.             case dataList:
  2473.                 if($controlDefinition=='slider'){
  2474.                     // HTML objects
  2475.                     $output.='<fieldset class="asCtrlHSliderExt" name="asUpdt'.$dataName.'_ext" onmouseup="controlSliderC'.$dataName.'()">';
  2476.                     $output.='<legend></legend>';
  2477.                     $output.='<div class="asCtrlHSliderBlock" '.((isset($extraOptions['width']))?'style="width:'.$extraOptions['width'].'"':'').'></div>';
  2478.                     $output.='<div class="asCtrlHSliderBar" id="asUpdt'.$dataName.'_bar" onmouseup="controlSliderC'.$dataName.'()"';
  2479.                     //if(isset($extraOptions['width'])) $output.='style="width:'.$extraOptions['width'].'"';
  2480.                     $output.='></div>';
  2481.                     $output.='<div class="asCtrlHSliderThumb" id="asUpdt'.$dataName.'_thumb"></div>';
  2482.                     $output.='</fieldset>';
  2483.                     $output.='<input class="textInput asCtrlHSliderTxt" type="text" size="1" name="asUpdt'.$dataName.'" disabled="disabled">';
  2484.                     // Drag items
  2485.                     cfDragAddItem('asUpdt'.$dataName.'_bar','+NO_DRAG+CURSOR_HAND');
  2486.                     cfDragAddItem('asUpdt'.$dataName.'_thumb','+HORIZONTAL+CURSOR_HAND+"DRAGFUNC(controlSlider'.$dataName.')"','controlSliderInit'.$dataName.'()');
  2487.  
  2488.                     // Associated scripts
  2489.                     $output.='<script type="text/javascript">';
  2490.                     $output.='var controlSlider'.$dataName.'Values=new Array('.$outCD[$dataName];
  2491.                     foreach ($constraints as $v) $output.=','.$v;
  2492.                     $output.=');';
  2493.                     $output.='function controlSlider'.$dataName.'(){';
  2494.                     $output.='var thumb=dd.elements.asUpdt'.$dataName.'_thumb;';
  2495.                     $output.='var bar=dd.elements.asUpdt'.$dataName.'_bar;';
  2496.                     $output.='var arr=controlSlider'.$dataName.'Values;';
  2497.                     $output.='if(thumb.x+thumb.w>bar.x+bar.w) thumb.moveTo(bar.x+bar.w-thumb.w,false);';
  2498.                     $output.='if(thumb.x<bar.x)thumb.moveTo(bar.x,false);';
  2499.                     $output.='var pos=(thumb.x-bar.x)/(bar.w-thumb.w);pos=arr[1+Math.floor(pos*(arr.length-2))];';
  2500.                     $output.='if(arr[0]==pos) return;arr[0]=pos;dgn("asUpdt'.$dataName.'").value=pos;';
  2501.                     $output.='if(window.my_asUpdt) my_asUpdt("'.$dataName.'",pos);'.((isset($extraOptions['noAsync']))?'':'asUpdt("'.$dataName.'",pos+"",1)').'}';
  2502.                     $output.='function controlSliderC'.$dataName.'(e){dd.elements.asUpdt'.$dataName.'_thumb.moveTo(mouseEvt.x-dd.elements.asUpdt'.$dataName.'_thumb.w/2,false);controlSlider'.$dataName.'()}';
  2503.  
  2504.                     // Init function
  2505.                     $initCommands ='var thumb=dd.elements.asUpdt'.$dataName.'_thumb;';
  2506.                     $initCommands.='var bar=dd.elements.asUpdt'.$dataName.'_bar;';
  2507.                     $initCommands.='var arr=controlSlider'.$dataName.'Values;';
  2508.                     $initCommands.='thumb.setZ(bar.z+1);';
  2509.                     $initCommands.='thumb.minXPos=bar.x+1;';
  2510.                     $initCommands.='thumb.maxXPos=bar.x+bar.w-thumb.w;';
  2511.                     $initCommands.='pos=0; while(pos+2<arr.length && arr[0]>arr[pos+1]) pos++;';
  2512.                     $initCommands.='if(arr.length>1) pos=pos/(arr.length-1);';
  2513.                     $initCommands.='thumb.moveTo(thumb.minXPos+pos*(thumb.maxXPos-thumb.minXPos),false);';
  2514.                     $initCommands.='dgn("asUpdt'.$dataName.'").value=arr[0];';
  2515.                     $output.='function controlSliderInit'.$dataName.'(){'.$initCommands.'}';
  2516.                     $output.='</script>';
  2517.  
  2518.                 }
  2519.                 elseif(!is_array($controlDefinition) || count($controlDefinition)<2) return false;
  2520.                 //<select>
  2521.                 elseif(count($controlDefinition)==3 && is_array($controlDefinition[1]) && ((!is_array($controlDefinition[0])) || count($controlDefinition[0])<3)){
  2522.                     list($item1,$item2,$item3)=$controlDefinition;
  2523.                     $output.=outDisplayLabelAndOrImage($item1,alignLabelControl);
  2524.                     $output.='<select name="asUpdt'.$dataName.'" size="1" class="textInput"  onChange="asUpdt(\''.$dataName.'\',this.value)">';
  2525.                     foreach ($item2 as $value) {if(is_array($value) && count($value)==2) $output.='<option value="'.$value[0].'"'.(($outCD[$dataName]==$value[0])?' selected':'').'>'.$value[1]."</option>\n";}
  2526.                     $output.="</select>\n";
  2527.                     $output.=outDisplayLabelAndOrImage($item3,alignControlLabel);
  2528.                 }
  2529.                 else{
  2530.                 // Radio buttons
  2531.                     foreach ($controlDefinition as $value){
  2532.                         if(is_array($value) && count($value)==3){
  2533.                             list($item1,$item2,$item3)=$value;
  2534.                             $output.=outDisplayLabelAndOrImage($item1,alignLabelControl);
  2535.                             $output.='<input type="radio" name="asUpdt'.$dataName.'"  onClick="asUpdt(\''.$dataName.'\',this.value)" value="'.$item2.'" '.(($outCD[$dataName]==$item2)?'checked="checked"':'').">\n";
  2536.                             $output.=outDisplayLabelAndOrImage($item3,alignControlLabel);
  2537.                         }
  2538.                     }
  2539.                 }
  2540.             break;
  2541.             // BOOLEAN DATA
  2542.             case dataBoolean:
  2543.                 // Checkbox
  2544.                 // Control definition :
  2545.                 //     array($controlDefinitionArray) : checkbox with image and/or caption
  2546.                 //    array($controlDefinitionArray,$controlDefinitionArray) : 2 radio buttons with image and/or caption
  2547.                 if(!is_array($controlDefinition)) $controlDefinition=array($controlDefinition);
  2548.                 // Checkbox
  2549.                 if(count($controlDefinition)==1){
  2550.                     $output.='<input onChange="asUpdt(\''.$dataName.'\',this.checked)" onClick="asUpdt(\''.$dataName.'\',this.checked)" type="checkbox" name="asUpdt'.$dataName.'" '.(($outCD[$dataName])?'checked':'').' />';
  2551.                     $output.='<span onclick="obj=dgn(\'asUpdt'.$dataName.'\'); if(obj.disabled) return; obj.checked=!obj.checked;asUpdt(\''.$dataName.'\',obj.checked);">';
  2552.                     $output.=outDisplayLabelAndOrImage($controlDefinition[0],alignControlLabel);
  2553.                     $output.='</span>';
  2554.                 }
  2555.                 // Radio button (Warning : first item is always true, second is always false)
  2556.                 elseif(count($controlDefinition)==2){
  2557.                     $first=true;
  2558.                     foreach ($controlDefinition as $value){
  2559.                         // radio button
  2560.  
  2561.                         // "true" button
  2562.                         if($first) $output.='<input onChange="asUpdt(\''.$dataName.'\',this.value)" onClick="asUpdt(\''.$dataName.'\',this.value)" type = "radio" name="asUpdt'.$dataName.'" value="true" '.(($outCD[$dataName])?'checked':'').'>';
  2563.                         // "false" button
  2564.                         else $output.='<input onChange="asUpdt(\''.$dataName.'\',!this.value)" onClick="asUpdt(\''.$dataName.'\',!this.value)" type = "radio" name="asUpdt'.$dataName.'" value="false" '.((!$outCD[$dataName])?'checked':'').'>';
  2565.                         $output.='<span onclick="obj=document.getElementsByName(\''.$dataName.'\')['.(($first)?'0':'1').'];if(obj.disabled) return;obj.checked=true;asUpdt(\''.$dataName.'\','.(($first)?'!':'').'this.checked);">';
  2566.                         $output.=outDisplayLabelAndOrImage($value,alignControlLabel);
  2567.                         $output.='</span>';
  2568.                         if($first) $first=false;
  2569.                     }
  2570.                 }
  2571.             break;
  2572.  
  2573.             // FILE OR DIRECTORY
  2574.             // Control definition:
  2575.             //    optional string: caption
  2576.             case dataFolderPath:
  2577.             case dataFilePath:
  2578.                 // Corrects file/path case
  2579.                 $path=cfCorrectFilenameCase(str_replace('*appDir*',cfAppDataRootDir(),$outCD[$dataName]),true);
  2580.                 if(cfIsSubDir(cfAppDataRootDir(),$path)) $outCD[$dataName]='*appDir*'.substr($path,strlen(cfAppDataRootDir())); else $outCD[$dataName]=$path;
  2581.  
  2582.                 $output.='<img alt="" src="'.(($dataType==dataFolderPath)?outIcon('folder'):outIcon('blankFile')).'" style="vertical-align:middle; margin-right:0.5em;">';
  2583.                 // Caption
  2584.                 if($controlDefinition!==true && !is_array($controlDefinition)) $output.=$controlDefinition;
  2585.                 elseif($dataType==dataFolderPath) $output.='<b>'.cfCaption('genDirectory').'</b>';
  2586.                 else $output.=cfCaption('genFile');
  2587.                 // Input text box
  2588.                 $output.='<input class="textInput" onKeyUp="asUpdt(\''.$dataName.'\',this.value);this.style.color=\'\';" onChange="asUpdt(\''.$dataName.'\',this.value);" type="text" name="asUpdt'.$dataName.'" id="'.$dataName.'" size="36" style="margin-left:1em;margin-right:1em;'.(($path!='computerRoot' && !file_exists($path))?'color:red;':'').'" value="'.(($path=='computerRoot')?cfCaption('explorerComputerRoot'):cfUTF8Encode($path)).'">';
  2589.                 if($dataType==dataFolderPath){
  2590.                     // Folder selection button (application environment only)
  2591.                     if(cfIsInApp())
  2592.                         $output.=outButton(cfCaption('genBrowse'),"javascript:wl.UICommand('openFolder','".$dataName."')",outIcon('fi/folder'),cfCaption("genDirectory"),false,'onclick="asUpdt(\''.$dataName.'\',this.value)"');
  2593.                     // Computer root button
  2594.                     if($constraints!='noComputerRoot') $output.=outButton('','javascript:dgi(\''.$dataName.'\').value=\''.cfCaption('explorerComputerRoot').'\';asUpdt(\''.$dataName.'\',this.value);', outIcon('computerRoot'),cfCaption("explorerComputerRoot"));
  2595.                     // Special : 'path' data is commonly used as base directory for explorer resources - show help button
  2596.                     if($dataName=='path') $output.='   '.outHelpButton('helpPath');
  2597.                 }
  2598.                 else{
  2599.                     // File selection button (application environment only)
  2600.                     if(cfIsInApp())
  2601.                         $output.=outButton(cfCaption('genBrowse'),"javascript:wl.UICommand('openFile','".$dataName.";".$constraints."')",outIcon('explorer'),false,false,'onclick="asUpdt(\''.$dataName.'\',this.value)"');
  2602.                 }
  2603.             break;
  2604.  
  2605.             // IMAGE
  2606.             // Control definition:
  2607.             // left-hand caption | Array(left-hand caption, extraStyle)
  2608.             // Use constraint as path to images
  2609.             case dataImage:
  2610.                 $path=((is_array($constraints))?$constraints[0]:$constraints);
  2611.                 if(substr($path,0,strlen(cfAppDocRoot()))==cfAppDocRoot()) $path=substr($path,strlen(cfAppDocRoot()));
  2612.                 $output.=((isset($controlDefinition[0]))?$controlDefinition[0]:$controlDefinition).'  '.outImage($path.'/'.$outCD[$dataName],'javascript:asUpdtImg(\''.$dataName.'\')','name="asUpdt'.$dataName.'" class="imageSelector"',((isset($controlDefinition[1]))?$controlDefinition[1]:false));
  2613.                 // Image selection popup
  2614.                 $output.='<div class="popup" style="text-align:center;display:none;width:400px;height:400px;" id="asUpdtImg'.$dataName.'" onkeypress="asUpdtImgKP(\''.$dataName.'\',event)">';
  2615.                 $output.=outFrameHeaderTable('popupHeader',
  2616.                     ((@count($controlDefinition)==1)?$controlDefinition[0]:''),
  2617.                     outButton(cfCaption('genCancel'),'javascript:asUpdtImgH(\''.$dataName.'\')',outIcon('cancel')));
  2618.                 $output.='<div style="text-align:left; height:370px;overflow:auto">';
  2619.                 foreach (glob(((is_array($constraints))?$constraints[0]:$constraints).'/'.((is_array($constraints) && isset($constraints[1]))?'*.{'.implode(',',$constraints[1]).'}':'*.*'),GLOB_BRACE) as $file){
  2620.                     $output.=outImage($path.'/'.basename($file),'javascript:asUpdtImgS(\''.$dataName.'\',\''.basename($file).'\')','class="imageSelectorImg"');
  2621.                 }
  2622.                 $output.='</div></div>';
  2623.             break;
  2624.         }
  2625.     }
  2626.     return $output;
  2627. }
  2628.  
  2629. /**
  2630.  * @desc Return async control modified data name
  2631.  *
  2632.  * @return mixed value, null if no command passed
  2633.  */
  2634. function outControlCommandName(){
  2635.     if(!isset($_POST['asUpdtName'])) return null;
  2636.     return $_POST['asUpdtName'];
  2637. }
  2638.  
  2639. /**
  2640.  * @desc Return async control modified data value
  2641.  *
  2642.  * @return mixed value, null if no command passed
  2643.  */
  2644. function outControlCommandValue(){
  2645.     if(!isset($_POST['asUpdtValue'])) return null;
  2646.     return $_POST['asUpdtValue'];
  2647. }
  2648.  
  2649. /**
  2650.  * @desc Return code for thumnails size buttons
  2651.  *
  2652.  * @param bool $resourceHasThumbnails: true if...
  2653.  * @return string
  2654.  */
  2655. function outThumbnailsSizeButtons($resourceHasThumbnails=true){
  2656.     // If locked, do not display control
  2657.     if(cfRGetVar('thumbnailsSizeFactorLocked') || ((!$resourceHasThumbnails) && efFilesListIsResource())) return '';
  2658.  
  2659.     $ts=cfRGetVar('thumbnailsSizeFactor');
  2660.     $dis=(efFilesListType()=='list');
  2661.     $out='';
  2662.     for($i=0;$i<3;$i++)
  2663.         $out.=outButton(false,'javascript:efTNSize('.$i.')',outIcon('efTNSize'.$i.''),cfCaption('genSize').' - '.(1+$i).'/3','efTNSize'.$i,false,false,$dis||($ts==$i));
  2664.     return $out;
  2665.     //return outButton('','javascript:ContextMenu(Array({\'caption\':\'youpi\',\'action\':\'alert(1)\'}), {\'button\':this})',outIcon('gears'));
  2666. }
  2667.  
  2668. /**
  2669.  * @desc Return code for a selectable/hoverable frameset item
  2670.  *
  2671.  * @param string $content: HTML
  2672.  * @param string $extraHTML: extra HTML embedded in <fieldset>
  2673.  * @param string $extraStyle: extra style of <fieldset> element
  2674.  * @param string $options: onclick=>onclick javascript function(), type=>'checkbox' or 'radio';
  2675.  * @param string $state: 'sel', 'unsel', 'disabled'
  2676.  */
  2677. function outBlockItem($groupName,$content,$extraHTML='',$extraStyle='',$options=false,$state='unsel'){
  2678.     $out='<fieldset name="'.$groupName.'" class="blockItem'.(($state=='unsel')?'':(($state=='sel')?' biSel':' biDisabled')).'" ';
  2679.     $out.='onmouseover="wl.blockItem(this).over()" onmouseout="wl.blockItem(this).out()" ';
  2680.     $out.='onclick="wl.blockItem(this).select(1,'.((int)(@$options['type']=='checkbox')).');'.((isset($options['onclick']))?$options['onclick']:'').'" ';
  2681.     $out.='style="'.$extraStyle.'"';
  2682.     $out.=' '.$extraHTML;
  2683.     return $out.'>'.$content.'</fieldset>';
  2684. }
  2685. ?>